声音分析 FFT

Posted

技术标签:

【中文标题】声音分析 FFT【英文标题】:Sound Analysis FFT 【发布时间】:2018-06-25 17:39:13 【问题描述】:

我正在寻找分析机器的声音,该机器带有连接到 DAQ 板的麦克风以收集数据。数据存储在一个 excel 文件中,然后我想在 MATLAB 中读取该数据并执行 FFT 以查看导致最大噪声幅度的频率。为了测试我的系统,我通过函数发生器将一些已知频率输入 DAQ。然而,当我从函数发生器向 DAQ 输入 400Hz 信号,收集数据,将其上传到 MATLAB 并绘制它时,我没有看到任何 400Hz 的音调,只有一些更高频率的音调。这是我的代码有问题吗?

y = xlsread('TrialExcel400HzOscilloscope.xlsx');      
y = detrend(y);
n = length(y);

Fs = 48000;                 
nfft = 4096;                
Ts = 1/Fs;                  
t = 0:Ts:(n*Ts)-Ts;        

numUniq = ceil((nfft+1)/2); 
f = (0:numUniq-1)'*Fs/nfft; 



figure(1)                   
hAx(1) = subplot(211);
hLine(1) = line('XData',t,'YData',nan(size(t)), 'Color','b', 'Parent', hAx(1));
xlim([0 0.05]);            
ylim([-10 10]);              
xlabel('Time (s)');
ylabel('Amplitude (Volts)');
title('Time Domain');

hAx(2) = subplot(212);
hLine(2) = line('XData', f, 'YData', nan(size(f)), 'Color', 'b', 'Parent', hAx(2));
grid
xlim([0 25000]);           
ylim([0 80]);               
xlabel('Frequency (Hz)');
ylabel('Magnitude (dB)');
title('Frequency Domain');

a = 20*log10(abs(fft(y,nfft)));                                   


set(hLine(1), 'YData',y);                                              
set(hLine(2), 'YData', a(1:numUniq));      

【问题讨论】:

什么是n?是length(y)吗?这与nfft 相比如何?因为您在这里所做的是计算信号中第一个 nfft 样本的 DFT,而不是信号中的第一个 nfft 频率。我建议改为设置nfft=length(y) 是的 n 是长度(y) 我只是忘了定义它!看来我有点多余,因为 nfft 和 length(y) 是相同的值。 DAQ 仅返回 4096 个点。 【参考方案1】:

“我通过函数发生器将一些已知频率输入到 DAQ”——那么其他频率是否可以正常工作?

您看到的峰值可能是 DAG 中的噪声或频率发生器的问题。

考虑到您的信号略低于 0.1 秒,我希望在其中看到大约 40 个正弦波周期(实际上,由于您仅绘制了 0.05 秒,因此在您的图表中正好是 20 个周期)。这个信号显然不是这样的。

您用于计算和绘制频谱幅度的代码是可以的。

【讨论】:

不,它在我尝试过的任何频率下都不起作用。感谢您的帮助!

以上是关于声音分析 FFT的主要内容,如果未能解决你的问题,请参考以下文章

关于用FFT分析信号频谱的问题

FFT 频率分析似乎得到了错误的值

声音分析仪使用 naudio 处理 48000 个样本/秒的声音。我可以使用 1024 的循环样本大小吗?

用于音高检测的倒谱分析

基于matlab的声音信号采集与处理

matlab怎样进行频谱分析