python:对一个波形做傅里叶变换,能得到整个频谱,咋提取其中的频率分量呢对于有多个频率叠加的波形

你得到的频域序列上的每个点都对应着一个频率值。如果要获得更高的精度,可以在时间序列后面补零,点数越多,频域精度越高,但是,问题在于你是截取的原始信号,原始信号本身后面可能不是0,所以,这个仍然不是你所说的精确的。时域和频域的信号有个加窗的问题,你把时间信号截了一段,相当于加了一个矩形窗(让其他时间的信号为0,这段时间内部信号为原来的值),这个窗在频域本身是无限宽的,也就是说,有限时间的信号一定有无限的频域,有限频域的信号一定是时间无限长的(想一下余弦信号,是负无穷到正无穷的吧),所以你只能得到近似值。嗯最后说采样问题,你采样的频率是有限的,对于低通信号,要想还原信号,你的采样频率应该达到信号上限频率的2倍,所以,人耳听力范围 \u0026lt;20KHz,CD就是 44.1KHz 采样的。你拿到了一个离散时间信号,你必然知道这个信号的采样频率。对于你的数据长度和采样速率,数据长度就是你一次要计算的长度,这个是在精度、数据量、计算量之间决定的,fft 的计算数据长度一般是2的整数次幂;采样速率一般在 wav 文件头部里有。嗯,我的回答可能有点乱,但你的问题其实也有点乱,所以我看到什么就回答什么了,供你参考吧。
■网友
首先需要选定合适的FFT size,这涉及到频域频率的精度。
之后peak finding,简单的方法有2种:
argmax直接找最大值取相位平坦的地方最后为了提高精度,需要使用下峰值频率插值,二次或者sinc插值都行,估算正确的峰值频率。
参考:
Spectrum Analysis of Sinusoids

■网友
我之前写MATLAB的程序的时候解决过这个问题,我把我的解决方法写上来,希望能帮助到你。
我这边输入信号的参数是这样的:
Tb=2;A=1;fc=40 信号时间长度为2s,幅值为1,信号频率为40Hz。
我对它做fft之后,提取了频率信息ff,下面是结果:
python:对一个波形做傅里叶变换,能得到整个频谱,咋提取其中的频率分量呢对于有多个频率叠加的波形

你可以从我的频谱中看到,最高的那根谱线代表的是我的原始信号的频率信息,横坐标代表的是频率,纵坐标是幅度值的绝对值。
我频率的提取值是39.98Hz。
【python:对一个波形做傅里叶变换,能得到整个频谱,咋提取其中的频率分量呢对于有多个频率叠加的波形】 如果原始信号中有两个频率分量,那么结果是一样的:
python:对一个波形做傅里叶变换,能得到整个频谱,咋提取其中的频率分量呢对于有多个频率叠加的波形

第二根谱线代表的我原始信号中的第二个频率分量,频率是100Hz。
但是我们知道,如果直接对信号做fft的话,得到的序列是一个数组。这个数组的下标k表示的fft的第几个点,数组的内容是fft的结果:
python:对一个波形做傅里叶变换,能得到整个频谱,咋提取其中的频率分量呢对于有多个频率叠加的波形

这是和第一个例子一样的信号,我在输出的时候没有处理,直接stem(abs(X)),发现代表40Hz频率的那根谱线的横坐标是81,这个81表示的是它是fft结果数组X中的第81个元素。
但是,数组的元素下标和物理意义上的频率是有关联的,有下面这个公式:
f=k*fs/N
k是数组下标,fs是采样频率,N是你信号的长度。所以你在提取的时候,只要设置好你的阈值,然后找到那个点的横坐标,就可以利用上面的公式计算出它代表的频率信息了。这个过程在MATLAB和python中应该是类似的吧~

■网友
搬运工:频域信号处理 - 用Python做科学计算
■网友
搜 python fft,有个官方fft文档的


    推荐阅读