python求函数的频谱 python做信号频率分析

python 问题 。。。对一个波形文件做fft,然后怎么获取那些频率分量? numpy有这个函数你提问的问题,有点错误 。
波形是时域的,FFT变换就是为了将波形从时域转换到频域 。
做了FFT 以后,得到的数据就是频率分量 。
如果你说的是python fft代码如何写 。下面就是:
这边演示的是语音波形 。
wf = wave.open(wav_file,"rb")
params = wf.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
str_data = https://www.04ip.com/post/wf.readframes(nframes)
【python求函数的频谱 python做信号频率分析】wf.close()
#将波形数据转化为数组
s = np.fromstring(str_data, dtype=np.short)
#wave_data 。这里波形是语音波形
s = np.fft.fft(s)#fft获得频谱
Python科学计算——复杂信号FFTFFT (Fast Fourier Transform, 快速傅里叶变换) 是离散傅里叶变换的快速算法,也是数字信号处理技术中经常会提到的一个概念 。用快速傅里叶变换能将时域的数字信号转换为频域信号,转换为频域信号后我们可以很方便地分析出信号的频率成分 。
当我们把双频信号FFT示例中的 fft_size 的值改为 2**12 时 , 这时 , 基频为 16Hz,不能被 1kHz整除,所以 1kHz 处发生了频谱泄露 , 而它能被 4kHz 整除,所以 4kHz 可以很好地被采样 。
由于波形的前后不是连续的,出现波形跳变,而跳变处有着非常广泛的频谱,因此FFT的结果中出现了频谱泄漏 。
为了减小FFT所截取的数据段前后的跳变 , 可以对数据先乘以一个窗函数,使得其前后数据能平滑过渡 。常用的hanning窗函数的定义如下:
50Hz 正弦波与hann窗函数乘积之后的重复波形如下:
我们对频谱泄漏示例中的1kHz 和 4kHz 信号进行了 hann 窗函数处理,可以看出能量更加集中在 1kHz 和 4kHz,在一定程度上抑制了频谱泄漏 。
以 1kHz 三角波为例,我们知道三角波信号中含有丰富的频率信息,它的傅里叶级数展开为:
当数字信号的频率随时间变化时,我们称之为扫频信号 。以频率随时间线性变化的扫频信号为例,其数学形式如下:
其频率随时间线性变化,当我们在 [0,1] 的时间窗口对其进行采样时,其频率范围为 0~5kHz 。当时间是连续时,扫频信号的频率也是连续的 。但是在实际的处理中,是离散的点采样,因此时间是不连续的,这就使扫频信号的快速傅里叶变换问题退化为多点频信号快速傅里叶变换问题 。其快速傅里叶变换得到的频谱图如下所示:
以 50Hz 正弦信号相位调制到 1kHz 的信号为例,其信号形式如下:
它的时域波形,频率响应和相位响应如下图所示:
以扫频信号为例 , 当我们要探究FFT中的能量守恒时,我们要回归到信号最初的形式:
2020-01-18 python实现stft并绘制时频谱官方文档中给出了非常详细的安装方法
函数声明:
librosa.core.stft(y, n_fft=2048, hop_length=None, win_length=None, window='hann', center=True, dtype=class 'numpy.complex64', pad_mode='reflect')
常用参数说明:
y:输入的numpy数组,要求都是实数
n_fft:fft的长度,默认2048
hop_length:stft中窗函数每次步进的单位
win_length:窗函数的长度
window:窗函数的类型
return:一个1 n_fft/2*1 len(y)/hop_length的二维复数矩阵,其实就是时频谱
参考:
主要用这两个
matplotlib.pyplot.pcolormesh()
matplotlib.pyplot.colorbar()
关于python求函数的频谱和python做信号频率分析的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读