首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python NumPy -快速傅立叶变换和逆快速傅立叶变换?

Python NumPy -快速傅立叶变换和逆快速傅立叶变换?
EN

Stack Overflow用户
提问于 2012-04-19 14:36:05
回答 4查看 12.6K关注 0票数 6

我一直在使用FFT,目前我正在尝试使用FFT从文件中获取声音波形,(最终修改它),但随后将修改后的波形输出到文件中。我已经得到了soundwave的FFT,然后对它使用了一个逆FFT函数,但输出文件听起来一点都不正确。我没有对波形做任何过滤-我只是测试获取频率数据,然后把它放回一个文件-它听起来应该是一样的,但它听起来非常不同。

从那以后,我一直在这个项目上工作,但还没有得到预期的结果。输出的声音文件有噪声(声音更大,以及原始文件中没有的额外噪声),并且来自一个通道的声音泄漏到另一个通道(以前是安静的)。输入声音文件是立体声、2声道文件,声音仅来自一个声道。下面是我的代码:

代码语言:javascript
复制
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文件和音频文件,如果这可以帮助解决问题的here

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-25 09:37:35

代码语言:javascript
复制
>>> 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]])
票数 4
EN

Stack Overflow用户

发布于 2012-04-19 14:39:46

  1. 您似乎没有在此处应用任何滤波器,您可能想要获取fft (滤波后)的ifft,而不是输入波形的fft
票数 6
EN

Stack Overflow用户

发布于 2012-04-19 14:49:55

难道不应该更像这样吗?

代码语言:javascript
复制
filtereddata = numpy.fft.fft(data)
# do fft stuff to filtereddata
filteredwrite = numpy.fft.ifft(filtereddata)
wavfile.write('TestFiltered.wav', rate, filteredwrite)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10222812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档