如何在 MATLAB 中绘制扬声器的频率响应

Posted

技术标签:

【中文标题】如何在 MATLAB 中绘制扬声器的频率响应【英文标题】:How to plot in MATLAB the Frequency Response for a speaker 【发布时间】:2015-05-08 00:20:06 【问题描述】:

我试图通过扬声器播放 20Hz 到 20KHz 的啁啾声并将扬声器输出声音文件与原始输入声音文件进行比较来获得扬声器的频率响应。这是我到目前为止所拥有的,但情节看起来并不像我期望的那样。 Y 轴似乎不是以 dB 为单位的。我也可能做错了,我不确定。任何帮助是极大的赞赏。谢谢!

[y,fs] = wavread('LogChirp.wav');
[x,fs] = wavread('bose sweep 2 feet.wav');
y = reshape([y;zeros(145824-144000,1)],145824,1);
ydft = fft(x)./fft(y);
% Assume y has even length
ydft = ydft(1:length(y)/2+1);
% create a frequency vector
freq = 0:fs/length(y):fs/2;
% plot magnitude
ydft1 = smooth(ydft,.1);
p = semilogx(freq,ydft1);
p = plot(freq,abs(ydft));
set(p, 'Color', 'blue', 'LineWidth', 1);
xlabel('Frequency (Hz)');
ylabel('');
title('Frequency Response');
grid on;
%axis([20,20e3,-1,1]);

【问题讨论】:

看看pwelch,更好的频谱估计。除此之外,您可以通过这种方式估计的是扬声器和用于再次拾取声音的麦克风的组合频率响应。除非您现在了解麦克风的特性,否则无法将两者分开。 y 轴可能在数量级上。如果要转换为 dB,请使用 20*log10(abs(ydft)) 【参考方案1】:

要使 X 轴和 Y 轴都以 dB 为单位,您可以使用 loglog 函数绘制数据。 还要考虑在你的脚本中你有两个连续的情节说明

p = semilogx(freq,ydft1);
p = plot(freq,abs(ydft));

但不是指令“hold on”。

如果没有“hold on”,只会显示最后一个图表。

此外,两个绘图指令使用不同类型的比例(第一个记录,第二个记录)MatLab 不“喜欢”这一点,并为所有绘图保留它们的第一个。

希望这会有所帮助。

【讨论】:

以上是关于如何在 MATLAB 中绘制扬声器的频率响应的主要内容,如果未能解决你的问题,请参考以下文章

一叶知秋:扬声器的冲激响应与阻抗频率特性

如何用delphi实现扬声器发出一定频率的声音

计算正弦扫描频率响应的问题

频率记录如何与扬声器一起工作?

扬声器的单位冲激响应信号建模

频率分析 - Novocaine 和麦克风播放:如何禁用扬声器输出?