我需要用numpy制作光谱图。我把1s的音频分成0.02s的块。然后我使用numpy计算FFT,并将其放回一幅图像中。结果很差
以下是使用matplotlib specgram函数生成的光谱图:
这是我的“光谱图”:
这是我的密码:
spect_frags = []
transform = []
for x in range(0, 8000, 160):
spect_frags.append(spect_sample[x:x + 160])
for sample in spect_frags:
transform.append(abs(np.fft.fft(sample).real)[0:np.fft.fft(sample).real.size//4])
我削减了3/4的频率,因为我现在不需要它们。 我不知道为什么在分辨率上有如此多的差异。我怎样才能改进它
频谱图
您可以使用以下代码重新创建
specgram
的粗略估计值:它输出:
当^{} 呈现时:
此MCVE与
specgram
不同,因为轴应缩放以正确反映时间和频率,并且没有移动窗口。更准确地说:N=256
的时间chunck指数李>N//2=128
),注意使用fftshift
在fft
之后组合频谱李>fftfreq
可获得真实频率,在specgram
中,其范围为0到1,因为此方法不一定知道信号采样率李>specgram
稍不平滑的原因李>功率估算
还要注意的是,取复数的实部与取大小不同。主要是,当你写作时:
您没有使用复数的范数,但是由于
.real
调用,您完全删除了复数部分您应该使用product of conjugates来estimate the power:
然后使用
abs
将complex
类型转换为float
(或者只保留real
部分,因为复杂部分必须为null)。最后,您可以使用十进制对数在Decibel中进行缩放健康检查
您可以检查FFT的结果是否确实是复杂类型,并带有一个有意义的复杂部分(删除它会导致信息丢失):
共轭产物确实有一个空的复合部分(但仍然是
complex
型):通过断言以下内容,您可以确保这始终是正确的(健全性检查):
相关问题 更多 >
编程相关推荐