如何在 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 中绘制扬声器的频率响应的主要内容,如果未能解决你的问题,请参考以下文章