Ich werde die Einführung in den Klang in R-Sprache zusammenfassen. Ich habe Python schon mehrmals zusammengefasst, aber ich werde es zum Vergleich schreiben. Gleichzeitig möchte ich den Klang der Explosion von Nikkei 225 hören, bei der es sich um aperiodische Zeitreihendaten handelt. Die Referenz ist wie folgt. Referenz ③ zeigt, wie tuneR installiert wird. ①How to get started with sound in R (pdf) ②Play sound in Python ③Basic Sound Processing with R
Umgebung
Windows10
RStudio;Version 1.2.5042
python3.6.10
mic;hdmi
Ich habe es schon mehrmals gemacht, aber speichere die CSV-Datei und die zuletzt vorbereitete numerische Zeichenfolge als Sound mit dem folgenden Code als WAV-Datei und gebe sie aus.
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)
Ich konnte 4 Daten in Pandas für einen etwas allgemeineren Zweck wie folgt speichern und verwenden.
df = pd.DataFrame({'seasonal': pl3,
'trend': pl2,
'resid':pl4,
'observed':pl1})
df.to_csv('seasonal_trend.csv', index=False)
Ich habe unten 20 Mal hinzugefügt.
for i in range(20):
df.to_csv('seasonal_trend.csv', mode='a', header=False, index=False)
Das Lesen der CSV-Datei ist wie folgt.
df = pd.read_csv('seasonal_trend.csv')
pl3_seasonal = df['seasonal']
Erstellen und speichern Sie die Sounddatei des Hauptteils mit dem folgenden Code.
import wave
import numpy as np
import struct
import pyaudio
fs = 800 #Abtastfrequenz
#Sinus-Konvertieren Sie von 32768 in 32767 Integer-Wert(zu signierten 16bit pcm)
pl3_n = 32767*pl3_seasonal/max(pl3_seasonal)
swav = [int(x ) for x in pl3_n]
#Binär
binwave = struct.pack("h" * len(swav), *swav)
#Sinuswelle als WAV-Datei exportieren
w = wave.Wave_write("pl3_seasonal.wav")
params = (1, 2, fs, len(binwave), 'NONE', 'not compressed')
w.setparams(params)
w.writeframes(binwave)
w.close()
Und Sie können den Sound mit dem folgenden Code abspielen. Im Folgenden wird die oben gespeicherte 'pl3_seasonal.wav' abgespielt.
from playsound import playsound
playsound('pl3_seasonal.wav')
Die Tonausgabe ist die erste in R, aber einfach. Lesen Sie einfach die Audiodatei "mywave.wav" im Verzeichnis und machen Sie einen Ton.
library(tuneR) #load tuenR package
mwav = readWave("mywave.wav")
play(mwav)
Im Folgenden wird die Welle mit einer Sinuswelle berechnet, in eine WAV-Datei konvertiert und ausgegeben.
#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)
Es wird unten als "w_1.wav" gespeichert, dann geladen und abgespielt.
writeWave(w, 'w_1.wav')
rw = readWave("w_1.wav")
play(rw)
Ich habe oben festgestellt, dass Sie mit einer numerischen Zeichenfolge eine WAV-Datei erstellen und speichern können. Daher werde ich im Folgenden die vom Zeitreihenelement zerlegten decompose_seasonal-Daten in eine WAV-Datei konvertieren und als Sound ausgeben. Und schließlich speichern Sie die WAV-Datei.
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')
Obwohl es sich um aperiodische Daten handelt, ist der Aktienkurs ein typisches Beispiel für etwas, das sich beim Vibrieren ändert. Zerlegen wir also die jüngsten Kursschwankungen, wandeln sie in Sounds um und hören uns diesen Sound an. ** * Bitte imitieren Sie dies nicht, da ich mich darauf freue ** Vorerst werden wir es mit dem R-Code implementieren. Laden Sie die neuesten Daten für Nikkei 225 herunter und bereiten Sie sie vor. hz = 18 hat keine Periode, ist jedoch als Variable definiert, damit es in verschiedenen Periodenintervallen analysiert werden kann. Da die Anzahl der Daten nicht immer ein ganzzahliges Vielfaches von hz ist, haben wir ls eingeführt, um die Anzahl der Daten anzupassen.
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)
Trend, zufällig, saisonal, beobachtet (IIP) sind wie folgt
plot(decompose_IIP$trend)
plot(decompose_IIP$random)
plot(decompose_IIP$seasonal[0:72])
lines(decompose_IIP$seasonal[0:72])
seasonal | random |
---|---|
trend | observed |
Gleiches Bild wie oben, aber finden Sie saisonales_Bier, indem Sie m_Bier wie unten gezeigt mitteln und 3 davon ausgeben.
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)))
Im Gegensatz zum obigen Diagramm wurde es als Liniendiagramm erhalten. Der Inhalt ist der gleiche. Dies wurde als 130 Stück an csv ausgegeben.
write.csv(as.ts(rep(seasonal_beer,130)), file = 'decompose_seasonal130.csv')
Von hier aus ist es der gleiche Akkord wie bei der obigen Klangerzeugung. Lesen Sie also die CSV-Datei wie folgt.
ds <- read.csv(file = 'decompose_seasonal130.csv')
Auch hier wird die tuneR-Bibliothek verwendet, um die folgenden Sounds zu erzeugen. Auf diese Weise könnte ein Ton erzeugt werden. Ich möchte den Klang maximieren, also standardisiere ich die Zahlen wie Python.
library(tuneR)
ds_w = Wave(32678/max(abs(ds[2]))*ds[2], samp.rate = 150*hz, bit=16)
play(ds_w)
Speichern Sie es schließlich in einer Datei.
file_n <- paste('ds_',hz,'.wav')
writeWave(ds_w, file_n)
Auf diese Weise ändert sich die typische Schallwellenform wie folgt, wenn hz geändert wird. Mit anderen Worten, es sieht so aus, als ob der Vokal irgendwann reproduziert wird. Der tatsächliche Klang klingt ähnlicher als die Wellenform, daher bezweifle ich buchstäblich meine Ohren.
hz | Vokal schließen | Wellenform | Vokal |
---|---|---|---|
18 | Ah | ||
40 | e | ||
128 | ich | ||
16 | Oh | ||
17 | U. |
・ R_Audio / data / Unter dem oben genannten R_Audio/data/1_a_ds_ 18 .wav Bitte herunterladen und spielen.
Ich frage mich, warum dies geschieht. Schauen wir uns also die Datenstruktur an. Setze hz = 16 wie unten gezeigt und zerlege () in Gruppen von jeweils 16. Erstens, wenn Sie die Daten ausgeben
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
Und der wichtige Teil ist wie folgt
decompose_IIP <- decompose(IIP)
print(decompose_IIP$seasonal)
Mit anderen Worten, decompose_IIP $ saisonal wird wie unten gezeigt durch 16 Teile gemittelt.
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
In der Grafik sieht es folgendermaßen aus: Wenn Sie die Diagramme zählen, können Sie sehen, dass es 16 Zyklen gibt.
Diese Daten werden abgespielt. Und das Wichtigste ist, dass wenn Sie die Aktienkursdaten als periodisch betrachten und sie als Gruppe mit einer geeigneten Anzahl mitteln, einige Daten eine Datenzeichenfolge ähnlich einem Vokal ergeben. Selbst wenn dieselbe Verarbeitung für eine vollständige Zufallszahlenfolge durchgeführt wird, wird ein solches Ergebnis nicht erhalten, aber ich denke, dass es vorkommt, dass die Aktienkursdaten eine solche Struktur enthalten.
** Ah ~, Sie können mit dieser Methode das ursprüngliche Explosionsgeräusch nicht hören. .. .. ** **.
・ Ich habe die R- und Python-Soundeinführung verglichen ・ Ich habe versucht zu generieren, indem ich den Aktienkurs, bei dem es sich um aperiodische Daten handelt, zerlegt und die saisonalen Schwankungen, die zu periodischen Daten wurden, in Schall umgewandelt habe. ・ Es wurde festgestellt, dass durch Abtasten in einem geeigneten Zyklus ein Vokal erzeugt wird, der einem Vokal ähnlich ist.
・ Ich werde etwas mehr entwickeln und versuchen, mithilfe von decompose () und Klangerzeugung Vorhersagen zu treffen.