-->

Python的NumPy的 - FFT和逆FFT?(Python NumPy - FFT and

2019-07-29 01:14发布

所以,我一直与FFT,目前我正在试图摆脱与FFT文件中的声音波形,(修改它最终会),但那时,变形波形回文件输出。 我已经得到了声波的FFT,然后就可以使用逆FFT功能,但输出文件不健全的权利都没有。 我没有做任何过滤的波形 - 我只是测试得到的频率数据,然后把它放回文件 - 听起来应该是相同的,但它听起来完全不同。 有任何想法吗?

- 编辑 -

我后来一直在做这个项目了一点,但还没有得到预期的效果。 输出的声音文件是嘈杂(既更响亮,以及额外的噪音,这是不存在于原始文件),和声音从一个通道泄漏到另一信道(这在以前是沉默的)。 输入声音文件与声音只从一个通道来立体声,双声道文件。 这里是我的代码:

 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文件和音频文件,如果可以帮助解决这一问题在这里 。

Answer 1:

>>> 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]])


Answer 2:

  1. 您不会出现在这里套用任何筛选
  2. 你可能想利用ifft的的fft (后过滤),而不是输入波形。


Answer 3:

难道不应该更喜欢这个?

filtereddata = numpy.fft.fft(data)
# do fft stuff to filtereddata
filteredwrite = numpy.fft.ifft(filtereddata)
wavfile.write('TestFiltered.wav', rate, filteredwrite)


Answer 4:

两个问题。

您FFTing 2点声道的数据。 您应该只针对FFT FFT结果单数据的1路,使普通意义。 如果要,则应该IFFT(FFT())每个信道单独处理2个通道立体声数据。

您使用的是真正的FFT,其扔掉的信息,从而使得FFT不可逆的。

如果要反转,则需要使用其产生的复杂结果的FFT,然后IFFT此复频域向量回时域。 如果修改了频域向量,如果你想有一个真正严格的结果(减去的数字噪声)以确保它保持共轭对称。



文章来源: Python NumPy - FFT and Inverse FFT?