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 Python ③Basic Sound Processing with R
environnement
Windows10
RStudio;Version 1.2.5042
python3.6.10
mic;hdmi
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.
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é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')
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')
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 |
---|---|
trend | observed |
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. 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 | ||
40 | e | ||
128 | je | ||
16 | Oh | ||
17 | U |
・ 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.
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.
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. .. .. ** **
・ 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.