使用matlab用频谱图处理后从FFT帧中提取局部最大值

Extract local maximum from FFT frame after processing with spectrogram using matlab

我想在用频谱图处理信号后从 FFT 帧中提取局部最大值。

具体地说,我有一个音频文件,它是一个 wav 文件,它是在以下过程中收集的:

phone 用户将 smartphone 保持在大约一臂远的距离,吸满肺部容积,然后用力呼气,直到排出全部肺部容积。 phone 的微phone 记录呼气并在 wav 文件中存储数据。

然后我使用以下过程用频谱图处理音频:

首先,我将音频缓冲成 30 毫秒的帧(帧之间有 50% 的重叠)。然后使用汉明 window 对每一帧进行 window 编辑,并采用 |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 是我的音频文件。用频谱图处理信号后,我想在每帧中使用局部最大值提取共振,通过滑动 window 计算。然后,保存任何大于全局最大值 20% 的局部最大值。

下面显示了使用上述数据时频谱图的样子: Spectrogram image

这显示了从频谱图中提取后的共振应该是什么样子

After extracting resonaces from spectrogram image

到目前为止,我使用输出参数之一 s - 短时傅里叶变换来提取局部最大值。

这是我的代码:

 local_max=max(abs(s));
 threshold=0.2*max(local_max,[],2); 
 local_max=local(:,local_max>threashold);

问题是我不确定使用 s 是否正确,还是应该使用 ps - 功率谱密度 (PSD) 来实现我的目标。

谁能指点一下?任何帮助将不胜感激。

频谱图的输出 s 是信号中频率分量在 [t1, t2] 之间的振幅。

功率谱密度,可用于通过求和(如果是 CT 域,则为积分)计算给定持续时间 (STFT) 内频率范围内的功率量。这从名字上看有点直观,"density"。

因此,如果您将阈值逻辑应用于 ps 而不是 s,您将得到最高梯度(本地)而不是最大值(本地)。