Нахождение пиков на изображении спектрограммы

So, i have this code:

    [sound,fs,bits] = wavread(file);
    [S,F,T] = spectrogram(sound, 256, 200, 256, fs);
    plot(F,abs(S));
[sorted index] = sort(list,'descend');

Теперь мне нужно найти 3 самых высоких пика амплитуд в S (между частотами 0 и 1000, 1000 и 2000 и> 2000), для этого я делаю следующее:

ind = length(F);
for k=1:1:ind
    if F(k) >= 0 && F(k) < 1000
        listaAmpF1(k) = sorted(k);
    else

    if F(k) >= 1000 && F(k) < 2000
        listaAmpF2(k) = sorted(k);
    else

    if F(k) >= 2000
        listaAmpF3(k) = sorted(k);
    end

    end

    end
end

maxAmpF1 = max(listaAmpF1);
maxAmpF2 = max(listaAmpF2);
maxAmpF3 = max(listaAmpF3);

Предполагая, что теперь у меня есть все максимальные 3 ампера, которые мне нужны, мне нужно найти соответствующие частоты, как я могу это сделать?

Изменить: S и F имеют разную длину


person user2300158    schedule 06.05.2013    source источник
comment
Взгляните на второй выходной аргумент max.   -  person wakjah    schedule 06.05.2013


Ответы (1)


Вы можете использовать функцию findpeaks:

F = [100 15 2010 1350 450 2500 1100 720 2900 26]; % just to make an example.
S = [1.1 2.9 3.7 4.0 3.0 1.1 2.9 3.7 4.0 3.0]; % just to make an example.

spect_orig = timeseries(abs(S), F,'Name','spect');
spect_resampled = resample(spect_orig, [1:max(F)]);
[peak_values, peak_frequencies] = findpeaks(reshape(spect_resampled.data, 1, []), 'MINPEAKDISTANCE', 500);

вы можете настроить параметр MINPEAKDISTANCE, чтобы пики располагались в нужных вам интервалах.

person imriss    schedule 07.05.2013