2017-05-18 2 views
0

Ich versuche, maschinelle Lernalgorithmen auf Rohaudio anzuwenden. Mein Training wäre auf dem Fourier-Koeffizienten des Audiosignals. Ich habe versucht, diese und gelten ifft zu bekommen meine Audio zurück zu bekommen, aber es mit meiner Implementierung nicht funktioniert, das ist:Probleme mit scipy.io fft und ift

fs, data = wavfile.read('dataset piano/wav/music (1).wav') 
Te = 0.25 
T = 40 

a = data.T[0] #retrieve first channel 
#put the information in a matrix, one row will contain the fourier coefficients of 0.25s of music. 
#The whole matrix, which has 40 rows will contain information of 10s of the wav file. 
X = np.array([fft(a[int(i*fs*Te):int((i+1)*fs*Te)]) for i in range(T)]) 
Z = ifft(X.flatten()) 
Z = Z.astype(data.dtype) 

wavfile.write('test3.wav',fs,Z) 

Normalerweise sollte es die ersten 10 Sekunden der WAV-Datei spielen, aber es doesn‘ t und ich verstehe wirklich nicht warum. Alles, was ich bekomme, ist ein hoher Ton. Ich benutze das fft und ift von scipy.

Antwort

1

Sie waren sehr nah dran. Ändern Sie einfach

Z = ifft(X.flatten()) 

zu

Z = ifft(X).flatten() 

Was Sie tun, auf eine Verkettung von Spektren einer inversen Fourier-Transformation wird die Berechnung, die wirklich keinen Sinn macht. Ich denke, was Sie lieber tun möchten, ist inverse Fourier-Transformation auf Spektren verketten. Dies habe ich getan und es geschafft, ein Signal wiederzugeben, das gut klingt.

ifft(X) wird eine IFFT auf jedem Array entlang der letzten Dimension ausgeführt, die in Ihrem Fall die Spektrumdimension ist, und ein Array derselben Form (40, 11025) zurückgibt. Dann flacht jede Zeile und verkettet ein vernünftiges Signal.

+0

Vielen Dank! Es funktioniert jetzt perfekt! Danke auch für deine Erklärung! – Tiffany