Я хочу извлечь локальный максимум из кадра БПФ после обработки сигнала спектрограммой.
В частности, сказал, что у меня есть аудиофайл, который представляет собой wav
файл, и он собирается в следующей процедуре:
Пользователь телефона держит смартфон примерно на расстоянии вытянутой руки, вдыхает весь объем легких и с усилием выдыхает, пока не будет вытеснен весь объем легких. Микрофон телефона записывает выдох и сохраняет данные в файле WAV.
Затем я обрабатываю звук с помощью спектрограммы, используя следующую процедуру:
Во-первых, я буферизирую звук в кадры 30 мс (с перекрытием между кадрами 50%). Затем каждый кадр обрабатывается с использованием окна Хэмминга, и для построения спектрограммы амплитуды сигнала берется |FFT|db
.
Вот как я это делаю с помощью Matlab:
[X, FS] = audioread('Rec_002.wav');
info = audioinfo('Rec_002.wav');
window = (30*0.001/info.Duration)*info.TotalSamples;
[s,f,t,ps]=spectrogram(X, window, [], [], FS);
Rec_002.wav - мой аудиофайл. После обработки сигнала с помощью спектрограммы я хочу извлечь резонансы, используя локальный максимум в каждом кадре, рассчитанный по скользящему окну. Затем сохраняется любой локальный максимум, превышающий 20% глобального максимума.
Ниже показано, как выглядит спектрограмма при использовании данных выше: Изображение спектрограммы
Это показывает, как должны выглядеть резонансы после извлечения из спектрограммы.
После извлечения резонансов из изображения спектрограммы
К настоящему времени я использую один из выходных аргументов s
- Кратковременное преобразование Фурье для извлечения локального максимума.
Вот мой код:
local_max=max(abs(s));
threshold=0.2*max(local_max,[],2);
local_max=local(:,local_max>threashold);
Вопрос в том, что я не уверен, правильно ли использовать s
или мне следует использовать ps
- Спектральную плотность мощности (PSD) для достижения моей цели.
Кто-нибудь может указать мне? Любая помощь будет оценена.