使用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,您将得到最高梯度(本地)而不是最大值(本地)。
我想在用频谱图处理信号后从 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,您将得到最高梯度(本地)而不是最大值(本地)。