2017-05-03 1 views
2

Ich möchte meine Daten in einen Sound konvertieren. Meine Daten sind in einem Datenrahmen. Jede Spalte repräsentiert die relative Amplitude des Schalls bei einer bestimmten Frequenz. Jede Zeile ist ein Beispiel. Die Proben werden mit einer festen Abtastrate aufgezeichnet. Ich habe herausgefunden, wie man einen Sound mit der seewave package, aber nicht mit den spezifischen Frequenzen, die ich will.Konvertieren von Datenrahmenspalten in einen Ton

Beispiel:

library(seewave) 

# some dummy data, 3 columns 
set.seed(7) 
df <- data.frame(f1=rnorm(600,30,5), f2=rnorm(600,40,10), 3=rnorm(600,30,10)) 
df[df<0] <- 0 

mat <- as.matrix(df) 
mat <- t(mat) +0i # istft() only works with complex numbers 
sr <- 1000 # sample rate in Hz 
freqs <- c(500, 2000, 10000) # desired frequencies of output sounds for each column 

sound <- istft(mat,f=sr,ovlp=50,wl=256,output = "Wave") # creates a sound 
listen(sound) 

istft annimmt:

"eine komplexe Matrix resultierende eines Kurzzeit-Fourier-Transformation".

Mein mat Objekt ist offensichtlich nicht im richtigen Format, also bin ich mir nicht sicher, was die Ausgabe tatsächlich ist. Ich kann nicht herausfinden, wie man jede Spalte vom Datenframe auf die in freqs gespeicherten Frequenzen erzwingt.

Alle Ideen wären großartig.

Antwort

2

Eigentlich läuft Ihr Code aber es gibt eine Warnung sagen

1: In xprim * win: mehr Objektlänge ist nicht ein Vielfaches von kürzeren Objektlänge

Um dies zu beheben, müssen Sie mat hat eine Anzahl von Reihen zu haben, die durch 2 teilbar ist und kleiner ist als die FFT-Fensterlänge (wl):

library(seewave) 

# some dummy data, 3 columns 
set.seed(7) 
N = 128 
df <- data.frame(f1=rnorm(N,30,5), f2=rnorm(N,40,10), f3=rnorm(N,30,10)) 
df[df<0] <- 0 

mat <- as.matrix(df) 
#no need to transpose 
mat <- mat + 0i # istft() only works with complex numbers 

sr <- 1000 # sample rate in Hz 
freqs <- c(500, 2000, 10000) # desired frequencies of output sounds for each column 

sound <- istft(mat, f=sr, ovlp=50, wl=256, output = "Wave") # creates a sound 
listen(sound) 

Der obige Code gibt Ihnen diese Warnung nicht. Sie können den istft-Code für das in ?istft bereitgestellte Beispiel durchgehen und Ihren Code sehen, was die Warnung verursacht.

+0

Nizza zu fangen. Ich habe mein Problem herausgefunden und werde ein Answeer schreiben – Mark

1

Also habe ich es geschafft, indem ich mit der synth() Funktion Wellen synthetisiert habe. Dies arbeitet durch jede Spalte des Datenrahmens und erzeugt ein amplitudenmoduliertes Signal auf einer Trägerfrequenz. Dann werden die Ergebnisse aller Spalten addiert.

library(seewave) 
library(tuneR) 

nsamps <- 600 # number of samples to create 
sf <- 10 # sampling frequency of the data in Hz 
fout <- 22000 # Sample frequency of output sound (Hz) 
dout <- 10 # length of output sound file (seconds) 

# some dummy amplitude data, 3 columns 
df <- data.frame(f1 = sin((1:nsamps)/180*pi)+1, f2 = sin((1:nsamps)/180*pi + pi)+1, f3 = sin((1:nsamps)/90*pi)+1) 

mat <- as.matrix(df) 
freqs <- seq(100, 1000, length.out = ncol(mat)) # Carrier frequencies for each data column (Hz) 

syn <- 0 # this is the synthesised wave 
atemp <- seq(from=1, to=nrow(mat), length.out = fout*dout) # new times 
for(ii in 1:ncol(mat)){ # for each data column 
    scale_data <- (mat[,ii] - min(mat[,ii]))/diff(range(mat[,ii])) # scale each column between 0 and 1, comment out for absolute amplitudes across all columns 
    amp <- approx(x = 1:nrow(mat), y = scale_data, xout = atemp)$y # sample the amplitude data onto the new times 
    syn <- syn + synth(f = fout, d = dout, cf = freqs[ii], output = 'wave', a = amp) # build up the total synth wave 

} 

wave <- Wave(left = syn, samp.rate=fout, bit=16) # create a wave class 
listen(wave) # listen to the sound 

Hier ist der Code ein Spektrogramm Grundstück zu erstellen:

t_win <- 0.5 # window length for spectrogram (s) 
n_win <- t_win/(nsamps/sf/dout)*fout # calculate the window length in samples 
spectro(wave, f=fout, flim = c(0,1.1), wl = n_win, ovlp = 75) # plot the spectrogram 

enter image description here

Verwandte Themen