簡體   English   中英

Python NumPy - FFT 和逆 FFT?

[英]Python NumPy - FFT and Inverse FFT?

我一直在使用 FFT,我目前正在嘗試從帶有 FFT 的文件中獲取聲音波形(最終修改它),然后將修改后的波形輸出回文件。 我已經得到了聲波的 FFT,然后對其使用了逆 FFT 函數,但輸出文件聽起來根本不對。 我沒有對波形進行任何過濾——我只是測試獲取頻率數據,然后將其放回文件中——聽起來應該是一樣的,但聽起來卻大不相同。

從那以后我一直在做這個項目,但還沒有得到想要的結果。 輸出的聲音文件嘈雜(聲音更大,以及原始文件中不存在的額外噪音),並且來自一個通道的聲音泄漏到另一個通道(之前是靜音的)。 輸入聲音文件是一個立體聲 2 聲道文件,聲音僅來自一個聲道。 這是我的代碼:

import scipy
import wave
import struct
import numpy
import pylab

from scipy.io import wavfile

rate, data = wavfile.read('./TriLeftChannel.wav')

filtereddata = numpy.fft.rfft(data, axis=0)
print(data)

filteredwrite = numpy.fft.irfft(filtereddata, axis=0)
print(filteredwrite)

wavfile.write('TestFiltered.wav', rate, filteredwrite)

我不太明白為什么這不起作用。

我已經壓縮了問題 .py 文件和音頻文件,如果這可以幫助解決這里的問題。

  1. 您似乎沒有在此處應用任何過濾器
  2. 您可能想要采用fft (后濾波)的ifft ,而不是輸入波形。

不應該更像這樣嗎?

filtereddata = numpy.fft.fft(data)
# do fft stuff to filtereddata
filteredwrite = numpy.fft.ifft(filtereddata)
wavfile.write('TestFiltered.wav', rate, filteredwrite)
>>> import numpy as np
>>> a = np.vstack([np.ones(11), np.arange(11)])

# We have two channels along axis 0, the signals are along axis 1
>>> a
array([[  1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.],
       [  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.]])
>>> np.fft.irfft(np.fft.rfft(a, axis=1), axis=1)
array([[  1.1       ,   1.1       ,   1.1       ,   1.1       ,
          1.1       ,   1.1       ,   1.1       ,   1.1       ,
          1.1       ,   1.1       ],
       [  0.55      ,   1.01836542,   2.51904294,   3.57565618,
          4.86463721,   6.05      ,   7.23536279,   8.52434382,
          9.58095706,  11.08163458]])
# irfft returns an even number along axis=1, even though a was (2, 11)

# When a is even along axis 1, we get a back after the irfft.
>>> a = np.vstack([np.ones(10), np.arange(10)])
>>> np.fft.irfft(np.fft.rfft(a, axis=1), axis=1)
array([[  1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
          1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
          1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
          1.00000000e+00],
       [  7.10542736e-16,   1.00000000e+00,   2.00000000e+00,
          3.00000000e+00,   4.00000000e+00,   5.00000000e+00,
          6.00000000e+00,   7.00000000e+00,   8.00000000e+00,
          9.00000000e+00]])

# It seems like you signals are along axis 0, here is an example where the signals are on axis 0
>>> a = np.vstack([np.ones(10), np.arange(10)]).T
>>> a
array([[ 1.,  0.],
       [ 1.,  1.],
       [ 1.,  2.],
       [ 1.,  3.],
       [ 1.,  4.],
       [ 1.,  5.],
       [ 1.,  6.],
       [ 1.,  7.],
       [ 1.,  8.],
       [ 1.,  9.]])
>>> np.fft.irfft(np.fft.rfft(a, axis=0), axis=0)
array([[  1.00000000e+00,   7.10542736e-16],
       [  1.00000000e+00,   1.00000000e+00],
       [  1.00000000e+00,   2.00000000e+00],
       [  1.00000000e+00,   3.00000000e+00],
       [  1.00000000e+00,   4.00000000e+00],
       [  1.00000000e+00,   5.00000000e+00],
       [  1.00000000e+00,   6.00000000e+00],
       [  1.00000000e+00,   7.00000000e+00],
       [  1.00000000e+00,   8.00000000e+00],
       [  1.00000000e+00,   9.00000000e+00]])

兩個問題。

您正在對 2 通道數據進行 FFT。 您應該只對單聲道數據的 FFT 1 通道進行 FFT 結果,以使其具有一般意義。 如果要處理 2 個聲道的立體聲數據,則應分別對每個聲道進行 IFFT(FFT())。

您正在使用真正的 fft,它會丟棄信息,從而使 fft 不可逆。

如果要反轉,則需要使用產生復數結果的 FFT,然后將此復數頻域向量 IFFT 回時域。 如果您修改頻域矢量,如果您想要嚴格的實數結果(減去數值噪聲),請確保它保持共軛對稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM