Амплитудная фильтрация спектрограммы

Итак, я написал быстрый скрипт в Matlab, чтобы сделать для меня некоторую визуализацию.

function spectro(filename,maxFreq)

wavchunksizefix(filename);

[y,fs] = wavread(filename);

subplot(2,1,1);
plot(y);
ylim([0 1]);
title('Signal Amplitude');

subplot(2,1,2);
specgram(y,1024,fs);
ylim([0 maxFreq]);
cb = colorbar;
set(get(cb,'title'),'string','dB');
title('Original Signal Spectrogram');

Что мне было интересно, так это то, как изменить вывод specgram(), чтобы отображать только определенный диапазон дБ? Прямо сейчас он показывает целую кучу ненужного шума в диапазоне от 0 до 40 дБ, и я хочу видеть только от 0 до -50 дБ (к сожалению, я не могу опубликовать пример изображения, потому что я новичок).


person user1172075    schedule 26.01.2012    source источник
comment
Вы использовали ylim, попробуйте команду zlim. Если это не делает то, что вы хотите, извлеките данные из спектрограммы ( data = specgram( . . . ) ) и пороговое значение вручную перед построением графика.   -  person learnvst    schedule 27.01.2012
comment
Как оказалось (я действительно не проверял это до сих пор), выходные данные из Specgram() представляют собой ряд комплексных чисел. Поскольку я не совсем понимаю, почему это комплексные числа, мне придется сначала выяснить это.   -  person user1172075    schedule 27.01.2012
comment
Значения являются сложными, потому что спектрограмма дает вам амплитудные и фазовые компоненты для каждого частотного бина в каждую эпоху. Когда вы используете команду спектрограммы для построения графика, это эквивалентно выполнению surf(20*log10(abs(spectrogram_output))). Команда abs преобразует пары действительных/комплексных значений в величину, а логарифмический термин преобразует ее в шкалу db.   -  person learnvst    schedule 30.01.2012


Ответы (1)


Очень круто, спасибо ребята. Я написал это для фильтрации сигнала более 40 дБ, и, похоже, это работает.

[y,fs] = wavread('matrecord.wav'); 
centerval = mean(y); 
gdb = 20*log10(y/centerval);
ogv = (gdb > 40); 
x = y;
x(ogv) = 0; 

Когда я запускаю для этого specgram(), кажется, что это работает.

person user1172075    schedule 30.01.2012