2014-11-30 3 views
5

Я использую функцию matplotlib specgram для создания спектрограммы. Я попытался включить цветную панель справа от спектрограммы, чтобы дать представление о дБ-к-цветном отображении.Matplotlib spectrogram интенсивность легенда (colorbar)

По какой-то причине дБ, обозначенные цветной панелью, не имеют смысла.

Возможно, я не создал цветной бар правильно? Возможно, есть какой-то параметр, который мне нужно передать в specgram?

Сигнал, который я генерирую, представляет собой синусоид 1 кГц, 2 В пер. Тока, отсчитываемый при 32 Гц.

Я ожидаю, что темно-красный пик на спектрограмме соответствует 0дБу (Это означает, что + 1V моя ссылка)

Кто-нибудь есть какие-либо идеи, что случилось с моим подходом?

def plot_specgram(data, title='', x_label='', y_label='', fig_size=None): 
    fig = plt.figure() 
    if fig_size != None: 
     fig.set_size_inches(fig_size[0], fig_size[1]) 
    ax = fig.add_subplot(111) 
    ax.set_title(title) 
    ax.set_xlabel(x_label) 
    ax.set_ylabel(y_label) 
    pxx, freq, t, cax = plt.specgram(data, Fs=32000) 
    fig.colorbar(cax).set_label('Intensity [dB]') 

plot_specgram(a,title='Spectrogram', x_label='time (in seconds)', y_label='frequency', fig_size=(14,8)) 

Это то, что я получаю в результате спектрограммы:

resulting plot

+0

С карты цветов, темно-красный * это *, кажется, соответствуют 0. Так что 0 не отображается ... The 0db (темно-красный) соответствует пиковой спектральной составляющей 1kHz ... Синий, как и ожидалось, имеет более низкое значение интенсивности (<< 0), поскольку они являются просто артефактами, разработанными из-за выборки ... Я откровенно не вижу ничего плохого в вашем коде/графике ... –

+0

Собственно, вероятно, то, что вы видите, является результатом функции окна, которую вы не учитываете. Я почти уверен, что 'specgram' использует окно Hanning как значение по умолчанию, которое может испортить то, что вы ожидаете от масштабирования. – Ajean

ответ

3

Прежде всего, пожалуйста, укажите Ваш a вектор, так как он, кажется, есть какой-то гармоник.

Это немного проб и ошибок, но это, кажется, производит правильное масштабирование:

NFFT = 256 
ax.specgram(x/(NFFT/2), NFFT=NFFT, Fs=fs, mode='magnitude', window=plt.window_none) 

Используя окно, кажется, теряет около 1/2 пиковой мощности, вы, конечно, можете настроить для этого ,

Полный пример, где я ограничил динамический диапазон до 40 дБ (например, если вы хотите скрыть мелкие вещи).

import numpy as np 
import pylab as plt 

# generate a 1kHz sine wave 
fs = 32e3 
t = np.arange(0, 15, 1.0/fs) 
f0 = 1e3 
A = 1 
x = A*np.sin(2*np.pi*f0*t) 

fig, ax = plt.subplots() 
cmap = plt.get_cmap('viridis') 
vmin = 20*np.log10(np.max(x)) - 40 # hide anything below -40 dBc 
cmap.set_under(color='k', alpha=None) 

NFFT = 256 
pxx, freq, t, cax = ax.specgram(x/(NFFT/2), Fs=fs, mode='magnitude', 
           NFFT=NFFT, noverlap=NFFT/2, 
           vmin=vmin, cmap=cmap, 
           window=plt.window_none) 
fig.colorbar(cax) 

print np.max(pxx) # should match A 

resulting image

Смежные вопросы