【发布时间】:2017-09-08 13:40:09
【问题描述】:
在我上一个问题AttributeError: 'module' object has no attribute 'spectrogram' 中,我正在编写一个小python 脚本,它读取一个Wav 音频文件,计算频谱图并将相应的数据再次写回一个Wav 文件。下面是一段代码:
Scipy 代码:
windowSize = 512
nOverlap_py = 160
nFFT = 1024
Fpy,Tpy,Spy=signal.spectrogram(s_orig_py,fs=fs_rate,window='hamming',nperseg=
windowSize,noverlap=nOverlap_py,nfft=nFFT,detrend=False,mode='complex')
Scipy 的前 10 个元素:
Scipy 的最后 10 个元素:
Matlab 代码:
[S,F,T] = spectrogram(s_orig,window,nOverlap,fftParams.nFFT,fs);
Matlab 的前 10 个元素:
Matlab 的最后 10 个元素:
在这两种情况下,参数都是相同的。只是有一个小问题: Spy 的值甚至不接近 S 的值,我不明白为什么。我知道它们不可能相同,因为这两个函数使用不同的算法来计算 FFT,但正如我之前提到的,它们甚至不接近。
此外,使用 Matlab,生成的 Wav 文件听起来与原始文件“完全相同”。使用 python 只是噪音。
【问题讨论】:
-
scipy 默认
return_onesided到True。尝试设置为False看看你会得到什么。 -
如果我理解正确,将
return_onesided设置为False基本上会返回FFT,这就是MATLAB 所做的。否则,您会在关闭奈奎斯特频率之前砍掉所有内容。 -
如果我的建议有效,我会写一个答案让你接受。
-
@MadPhysicist:不幸的是我得到了和以前一样的结果。
-
如果你尝试回放结果怎么办?
标签: python matlab python-2.7 scipy signal-processing