Python Scipy 频谱图

问题描述 投票:0回答:1

我正在尝试绘制一些 .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;

Matlab 绘图:

我正在尝试将代码转移到 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()

当我用 Python 绘制它时,我得到这个:

我在相对最大 dB 为 -0 dB 的录音机上录制了这些录音,所以我知道 Matlab 文件是正确的。我不知道如何在 Python 文件中修复它。

Matlab 中的频谱图文件返回的 S 由复数组成,而 Python 中返回的 Sxx 是实数(与 Matlab 数字的实部不同)。我不确定为什么这些数字如此不同?任何建议都有帮助,谢谢!

python matlab scipy spectrogram
1个回答
0
投票

如果设置

mode='psd'
,则
scipy.signal.spectrogram
返回幅度的平方。因此
Sxx
应对应于
abs(S)
的平方。

© www.soinside.com 2019 - 2024. All rights reserved.