[Introduction au son] Organisons l'introduction au son de python et de R ♬ -Écoutez le son de l'explosion de Nikkei 255-

Je résumerai l'introduction au son en langage R. J'ai déjà résumé python plusieurs fois, mais je vais l'écrire à titre de comparaison. En même temps, j'aimerais écouter le son de l'explosion du Nikkei 225, qui est une série temporelle apériodique. La référence est la suivante. La référence ③ montre comment installer tuneR. ①How to get started with sound in R (pdf) Play sound in PythonBasic Sound Processing with R

・ Sortie sous forme de son

environnement
Windows10
RStudio;Version 1.2.5042
python3.6.10
mic;hdmi

Faire un son avec python

Je l'ai fait plusieurs fois auparavant, mais enregistrez le fichier csv et la chaîne numérique préparée la dernière fois en tant que son avec le code suivant sous forme de fichier wav et sortez-le.

csv écrire et lire

import csv
with open('pl3_seasonal.csv', 'w') as f:
    fieldnames = ['seasonal']
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    writer = csv.writer(f, delimiter='\n')
    for i in range(20):
        writer.writerow(pl3)

J'ai pu stocker et utiliser 4 données dans des pandas dans un but un peu plus général comme suit.

df = pd.DataFrame({'seasonal': pl3,
                   'trend': pl2,
                   'resid':pl4,
                   'observed':pl1})
df.to_csv('seasonal_trend.csv', index=False)

J'ai ajouté 20 fois ci-dessous.

for i in range(20):
    df.to_csv('seasonal_trend.csv', mode='a', header=False, index=False)

La lecture du fichier csv est la suivante.

df = pd.read_csv('seasonal_trend.csv')
pl3_seasonal = df['seasonal']

Création et lecture de fichiers audio

Créez et enregistrez le fichier son de la partie principale avec le code suivant.

import wave
import numpy as np
import struct
import pyaudio

fs = 800 #Fréquence d'échantillonnage
#Onde sinusoïdale-Convertir de 32768 à 32767 valeur entière(à 16 bits pcm signé)
pl3_n = 32767*pl3_seasonal/max(pl3_seasonal)
swav = [int(x ) for x in pl3_n]
#Binaire
binwave = struct.pack("h" * len(swav), *swav)
#Exporter l'onde sinusoïdale sous forme de fichier wav
w = wave.Wave_write("pl3_seasonal.wav")
params = (1, 2, fs, len(binwave), 'NONE', 'not compressed')
w.setparams(params)
w.writeframes(binwave)
w.close()

Et vous pouvez jouer le son avec le code suivant. Ce qui suit jouera le "pl3_seasonal.wav" enregistré ci-dessus.

from playsound import playsound

playsound('pl3_seasonal.wav')

Faire un son avec R

La sortie audio est la première de R, mais c'est facile à faire. Lisez simplement le fichier audio «mywave.wav» dans le répertoire et émettez un son.

library(tuneR) #load tuenR package

mwav = readWave("mywave.wav")
play(mwav)

Ce qui suit calcule l'onde avec une onde sinusoïdale, la convertit en fichier wav et la produit en sortie.

#make a simple sine wave and play
t = seq(0, 3, 1/8000)
u = (2^15-1)*sin(2*pi*440*t)
w = Wave(u, samp.rate = 8000, bit=16)
play(w)

Il est sauvegardé sous "w_1.wav" une fois ci-dessous, puis chargé et lu.

writeWave(w, 'w_1.wav')
rw = readWave("w_1.wav")
play(rw)

J'ai trouvé ci-dessus que si vous avez une chaîne numérique, vous pouvez créer et enregistrer un fichier wav à partir de celle-ci. Par conséquent, dans ce qui suit, je vais convertir les données decompose_seasonal décomposées par éléments de la série temporelle en un fichier wav et les afficher en tant que son. Et enfin, enregistrez le fichier wav.

ds <- read.csv(file = 'decompose_seasonal.csv')
ds_w = Wave(32678/max(abs(ds))*ds, samp.rate = 8000, bit=16)
play(ds_w)
writeWave(ds_w, 'ds_w.wav')

Écoutez le son de l'explosion moyenne Nikkei

Bien qu'il s'agisse de données apériodiques, le cours de l'action est un exemple typique de quelque chose qui change en vibrant. Alors, décomposons les récentes fluctuations du cours des actions et convertissons-les en sons, et écoutons ce son. ** * Veuillez ne pas imiter cela car je l'attends avec impatience ** Pour le moment, nous allons l'implémenter avec le code R. Téléchargez et préparez les dernières données pour Nikkei 225. Bien que hz = 18 n'ait pas de période, il est défini comme une variable afin de pouvoir être analysé à différents intervalles de période. Puisque le nombre de données n'est pas toujours un multiple entier de hz, nous avons introduit ls pour ajuster le nombre de données.

data <- read.csv("./industrial/nikkei_225_.csv",encoding = "utf-8")
hz=18
ls = round(908/hz)*hz
IIP <- ts(data,start=c(1),frequency=1)
IIP=IIP[0:ls]
IIP <- ts(IIP,start=c(1),frequency=hz)

decompose_IIP <- decompose(IIP)

Tendance, aléatoire, saisonnière, observée (IIP) sont les suivantes

plot(decompose_IIP$trend)
plot(decompose_IIP$random)
plot(decompose_IIP$seasonal[0:72])
lines(decompose_IIP$seasonal[0:72])
seasonal random
plot_seasonal18.png random.png
trend observed
trend.png observed.png

Même image que ci-dessus, mais trouvez season_beer en calculant la moyenne de m_beer comme indiqué ci-dessous, et en sortie 3.

m_beer = t(matrix(data = decompose_IIP$seasonal, nrow = hz))
seasonal_beer = colMeans(m_beer, na.rm = T)
plot(as.ts(rep(seasonal_beer,3)))

Contrairement au graphique ci-dessus, il a été obtenu sous forme de graphique linéaire. Le contenu est le même. seasonal18.png Cela a été produit en csv en 130 pièces.

write.csv(as.ts(rep(seasonal_beer,130)), file = 'decompose_seasonal130.csv')

De là, c'est le même accord que la génération sonore ci-dessus. Autrement dit, lisez le fichier csv comme suit.

ds <- read.csv(file = 'decompose_seasonal130.csv')

Encore une fois, la bibliothèque tuneR est utilisée pour générer les sons suivants. De cette manière, un son pourrait être généré. Je veux maximiser le son, donc je standardise les nombres comme python.

library(tuneR)
ds_w = Wave(32678/max(abs(ds[2]))*ds[2], samp.rate = 150*hz, bit=16)
play(ds_w)

Enfin, enregistrez-le dans un fichier.

file_n <- paste('ds_',hz,'.wav')
writeWave(ds_w, file_n)

De cette manière, lorsque hz est modifié, la forme d'onde sonore typique change comme suit. En d'autres termes, il semble que la voyelle soit reproduite à un moment donné. Le son réel ressemble plus à la forme d'onde, donc je doute littéralement de mes oreilles.

hz Voyelle fermée Forme d'onde voyelle
18 Ah seasonal18.png a_real.jpg
40 e 2_e_ds_ 40 .png e_real.jpg
128 je 3_i_ds_ 128 .png i_real.jpg
16 Oh 5_o_ds_ 16 .png o_real.jpg
17 U 5_u_ds_ 17 .png u_real.jpg

Les données sonores obtenues sont placées ci-dessous

R_Audio / data / Sous ce qui précède R_Audio/data/1_a_ds_ 18 .wav Veuillez le télécharger et le lire.

À propos des données

Je me demande pourquoi cela se produit, alors jetons un coup d'œil à la structure des données. Comme indiqué ci-dessous, définissez hz = 16 et décomposez () par groupes de 16 chacun. Tout d'abord, lorsque vous sortez les données

hz=16
ls = round(908/hz)*hz
IIP <- ts(data,start=c(1),frequency=1)
IIP=IIP[0:ls]
IIP <- ts(IIP,start=c(1),frequency=hz)
print(IIP[0:ls])
> source('C:/R_data/decompose_audio.R')
  [1] 16820 17200 16930 16970 16820 16870 17030 16560 16800 16790 17410 17510 16870 16790 17230 17280
 [17] 17460 17780 18180 17980 17700 17120 17220 17560 17520 17710 17920 17920 17200 17140 17240 17270
...
[897] 20070 19940 19920 19930 20010 19940 19990 20010 20050 20000 20020 20010    NA    NA    NA    NA

Et la partie importante est la suivante

decompose_IIP <- decompose(IIP)
print(decompose_IIP$seasonal)

En d'autres termes, decompose_IIP $ season est en moyenne de 16 pièces comme indiqué ci-dessous.

Time Series:
Start = c(1, 1) 
End = c(57, 16) 
Frequency = 16 
  [1]  16.659497  17.697443  16.413961  16.955256 -14.905540  -7.621449  13.458097  10.605824
  [9]  -2.302557 -11.895191   4.550122  17.479809 -19.166396 -26.945414 -21.738941  -9.244521
...
[897]  16.659497  17.697443  16.413961  16.955256 -14.905540  -7.621449  13.458097  10.605824
[905]  -2.302557 -11.895191   4.550122  17.479809 -19.166396 -26.945414 -21.738941  -9.244521

Lorsqu'il est tracé sur le graphique, cela ressemble à ceci: Si vous comptez les parcelles, vous pouvez voir qu'il y a 16 cycles. 5_o_ds_ 16_seasonal .png

Ces données sont en cours de lecture. Et l'important est que si vous considérez que les données sur le cours de l'action sont périodiques et que vous les moyennez en tant que groupe avec un nombre approprié, certaines données vous donneront une chaîne de données similaire à une voyelle. Même si le même traitement est effectué sur une séquence de nombres aléatoires complète, un tel résultat ne sera pas obtenu, mais je pense qu'il arrive que les données de cours de bourse contiennent une telle structure.

** Ah ~, vous ne pouvez pas entendre le son d'explosion d'origine avec cette méthode. .. .. ** **

Résumé

・ J'ai comparé l'introduction sonore de R et Python. ・ Décomposez le cours de l'action, qui sont des données apériodiques, et convertissez les fluctuations saisonnières devenues des données périodiques en sons pour les générer. ・ On a constaté qu'en échantillonnant à un cycle approprié, un son similaire à une voyelle est généré.

・ Je vais imaginer un peu plus et essayer de prédire / prédire en utilisant decompose () et la génération de sons.

Recommended Posts

[Introduction au son] Organisons l'introduction au son de python et de R ♬ -Écoutez le son de l'explosion de Nikkei 255-
[Introduction à la décomposition des éléments] Organisons les méthodes d'analyse des séries chronologiques en R et python ♬
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
Introduction à Python Préparons l'environnement de développement
[Introduction à Python] Utilisation basique de la bibliothèque matplotlib
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
[Introduction to Data Scientists] Bases de Python ♬ Fonctions et classes
Je veux connaître la nature de Python et pip
[Introduction à Python] Combinaison des données Nikkei Average et NY Dow CSV
[Raspi4; Introduction au son] Enregistrement stable de l'entrée sonore avec python ♪
Comparons la transformée de Fourier de la source sonore synthétisée et le composite de la transformée de Fourier
[Introduction à Python3 Jour 1] Programmation et Python
[Python] PCA scratch dans l'exemple de "Introduction à la méthode d'analyse multivariée"
[Python] Comment obtenir le premier et le dernier jour du mois
[Introduction à Python] Utilisons les pandas
[Introduction à Udemy Python3 + Application] 69. Importation du chemin absolu et du chemin relatif
[Introduction à l'application Udemy Python3 +] 12. Indexation et découpage des chaînes de caractères
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
[Introduction à Python] Utilisons les pandas
Convertissez le résultat de python optparse en dict et utilisez-le
[Introduction to Data Scientists] Bases de Python ♬ Branchements conditionnels et boucles
[Introduction à Python] Utilisons les pandas
[Introduction à Python] Comment utiliser l'opérateur booléen (et ・ ou ・ non)
[Introduction aux Data Scientists] Bases de Python ♬ Fonctions et fonctions anonymes, etc.
[Python] Comment spécifier la position d'affichage de la fenêtre et la taille de matplotlib
[Introduction à Python] Quelle est la différence entre une liste et un taple?
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
[Introduction à Python] Une explication approfondie des types de chaînes de caractères utilisés dans Python!
[Introduction à Python] Quelle est la méthode de répétition avec l'instruction continue?
[Introduction à Python] Utilisons foreach avec Python
Introduction facile de la série python3 et d'OpenCV3
[Introduction au Data Scientist] Bases de Python ♬
Jouons avec Python Receive et enregistrez / affichez le texte du formulaire de saisie
Créez un environnement python pour apprendre la théorie et la mise en œuvre de l'apprentissage profond
Introduction à l'analyse des séries temporelles ~ Modèle d'ajustement saisonnier ~ Implémenté en R et Python
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
[Introduction à Python3 Jour 12] Chapitre 6 Objets et classes (6.3-6.15)
Résumé des différences entre PHP et Python
La réponse de "1/2" est différente entre python2 et 3
[Introduction à Udemy Python3 + Application] 19. Copie de la liste
Spécification de la plage des tableaux ruby et python
[Introduction à Python3, jour 22] Chapitre 11 Traitement parallèle et mise en réseau (11.1 à 11.3)
Comparez la vitesse d'ajout et de carte Python
[Introduction à Python3 Jour 11] Chapitre 6 Objets et classes (6.1-6.2)
[Introduction à Python3 Jour 20] Chapitre 9 Démêler le Web (9.1-9.4)
Introduction à Python avec Atom (en route)
Comparaison d'écriture R et Python (méthode de division mutuelle euclidienne)
Liste de code Python à déplacer et à mémoriser
[Introduction à l'algorithme] Trouvez l'itinéraire le plus court [Python3]
Prise en compte des forces et faiblesses de Python
De l'introduction de pyethapp à l'exécution du contrat
Une introduction au logiciel d'interface graphique de la plate-forme de classe fait avec Python / Tkinter! (Et de nombreux Try and Error)! (Au milieu de l'écriture)
[Introduction à Python] Utilisation de base des expressions lambda
[Introduction à Python] Utilisation basique de la bibliothèque scipy que vous devez absolument connaître
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
[Apprentissage automatique] "Détection d'anomalies et détection de changement" Dessinons la figure du chapitre 1 en Python.
[Introduction à Python] Résumé des fonctions et méthodes qui apparaissent fréquemment en Python [Format du problème]
Introduction à l'apprentissage automatique ~ Montrons le tableau de la méthode du K plus proche voisin ~ (+ gestion des erreurs)