我正在尝试绘制一些 .wav 文件的频谱图。
我最初是在Matlab中实现的,我的情节是有意义的。
Matlab代码:
sound = audioread(x);
[S, F, T] = spectrogram(sound(:,1),1000,500,1000,48000); %get channel 1
S_dB = mag2db(abs(S));
%disp(S_dB)
%play sound
[y, fs] = audioread(x);
player = audioplayer(y, fs);
play(player);
%plot figure
figure;
imagesc(T, F, S_dB);
axis xy;
title(x,'Spectrogram');
xlabel('Time (s)');
ylabel('Frequency (Hz)');
colorbar;
我正在尝试将代码转移到 Python,所以我使用 scipy。我有以下内容:
rate, data = wavfile.read(file)
#from Matlab: spectrogram(X = sound(:,1), WINDOW = 1000, NOVERLAP = 500,F = 1000,Fs = 48000)
f, t, Sxx = signal.spectrogram(data, fs=48000, window=('hamming'), nperseg=1000, noverlap=500, nfft=1000, detrend = 'constant', return_onesided=True, scaling='density', axis=-1, mode='psd')
dB = control.mag2db(np.abs(Sxx)) #get magnitude of signal and convert to dB
plt.pcolormesh(t, f, dB, shading='gouraud')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.colorbar()
plt.title(file) #V up, V down, H up, H down
plt.show()
我在相对最大 dB 为 -0 dB 的录音机上录制了这些录音,所以我知道 Matlab 文件是正确的。我不知道如何在 Python 文件中修复它。
Matlab 中的频谱图文件返回的 S 由复数组成,而 Python 中返回的 Sxx 是实数(与 Matlab 数字的实部不同)。我不确定为什么这些数字如此不同?任何建议都有帮助,谢谢!
如果设置
mode='psd'
,则 scipy.signal.spectrogram
返回幅度的平方。因此 Sxx
应对应于 abs(S)
的平方。