【问题标题】:Extract local maximum from FFT frame after processing with spectrogram using matlab使用matlab用频谱图处理后从FFT帧中提取局部最大值
【发布时间】:2017-04-04 14:03:25
【问题描述】:

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

具体来说,我有一个音频文件,它是一个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% 的任何局部最大值。

下面显示了使用上述数据时频谱图的样子: 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) 来实现我的目标。

谁能指出我?任何帮助将不胜感激。

【问题讨论】:

    标签: matlab audio signal-processing spectrogram


    【解决方案1】:

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

    功率谱密度,可用于通过求和(CT 域的积分)计算给定持续时间 (STFT) 频率范围内的功率量。从名称“密度”来看,这有点直观。

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

    【讨论】:

    • 那么你的意思是如果我使用ps,我正在提取最高梯度。要提取局部最大值,我必须改用s。顺便说一句,提取局部最大值在频谱图处理中是否有任何特殊意义。因为我是从一篇论文中读到的,我想了解作者为什么要提取局部最大值
    • 另外,我已经更新了我的问题,所以如果你有空闲时间,你可以看看它吗?谢谢。
    • 之所以使用频谱图,即短时FT,是因为输入信号是非平稳的,即频率内容随时间变化。因此,如果您有兴趣找出每个时间窗口内的共振频率,即振幅最大的频率,则需要 S 的局部最大值。
    • 好的,我明白了。顺便问一下,你能告诉我这个|FFT|db是什么意思吗?
    • 它仅表示 FFT 的幅度,单位为 dB
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2012-05-18
    • 2017-01-10
    • 2015-08-08
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多