在 MATLAB 中绘制频率响应,x 轴为对数刻度
Posted
技术标签:
【中文标题】在 MATLAB 中绘制频率响应,x 轴为对数刻度【英文标题】:Plot frequency response in MATLAB with a log scale in x-axis 【发布时间】:2016-11-23 02:27:10 【问题描述】:我正在尝试使用正弦波捕捉 Shure SM57 麦克风的频率响应。我使用freqz(data)
得到的一张图如下:
但是,我正在寻找更多在 x 轴上具有对数刻度的频率响应,如下所示(在 Shure SM57 的文档中)
知道如何准确地做到这一点吗?只是轴缩放吗?
【问题讨论】:
semilogx(x,y)
将在 x 轴上绘制对数刻度
我们如何将数据带出freqz? X 轴应为对数刻度,Y 轴应为 dB 刻度。
关于图表的有效性:如果您使用简单的扬声器-麦克风设置进行测量,大多数峰值和谷值通常由扬声器而不是 SM57 确定。您是否考虑过首先使用经过校准的测量麦克风来最终减去扬声器的频率响应?
@HartmutPfitzinger 这是个好问题。我已经考虑过了,但是您将如何获得扬声器的频率响应?对此有什么建议吗?而且我一直在尝试寻找如何校准测量麦克风。对此也有什么建议吗?
使用保证平坦频率响应的测量麦克风(例如 B&K,但也有更便宜的)。然后将两个麦克风放在同一位置,例如扬声器前方 1m。然后测量两个麦克风。最后,估计舒尔减去测量麦克风,假设后者代表扬声器的频率响应。
【参考方案1】:
例如,您可以通过添加输出参数从freqz
获得频率响应。当您使用输出参数调用 freqz
时,它不会创建绘图。然后您可以使用semilogx
并自己创建标签。
这是一个例子
fSample = 48e3;
[H, w] = freqz([1 2 1]);
Hdb = 20*log10(abs(H));
semilogx(w/pi*fSample/2, Hdb, '-r', 'LineWidth', 2);
ylabel('Magnitude (dB)');
% Play with the labels to make them look like the original picture
a = gca;
t2 = a.XTick(1:(end-1))*2;
ticks = [a.XTick; [t2 0]];
a.XTick = ticks(1:(end-1));
a.XTickLabelMode = 'manual';
a.XTickLabels = genLabels(a.XTick);
grid on;
genLabels
定义为
function lbls = genLabels(ticks)
lbls = cell(numel(ticks),1);
for idx=1:numel(ticks)
d = floor(log10(ticks(idx)));
unit = floor(d/3);
switch unit
case 0
unitLbl = '';
case 1
unitLbl = 'k';
case 2
unitLbl = 'M';
case 3
unitLbl = 'G';
case 4
unitLbl = 'T';
otherwise
error('Unsupported');
end
lblsidx = sprintf('%d%sHz', round(ticks(idx)/(10^(3*unit))), unitLbl);
end
end
输出图
编辑:我在示例中添加了基于一些预定义采样率的 x 轴缩放。
【讨论】:
这就够了!把它调到 0 Hz - 20 kHz 怎么样?我看到这些都在 rad/sample 中。抱歉,我是新手。freqz
绘制了假设数据采样率为 1Hz(1 个样本/单位时间)的频率响应。您可以通过采样率除以 4 来缩放 semilogx w/pi
的第一个参数。从图中可以看出,数据的采样率可能是 48kHz,这是 ShureSM57 的最大采样率。所以你可以试试semilogx(w/pi*(48e3)/4, Hdb);
哎呀意识到我给出的数学是错误的。你需要除以 2 而不是 4。所以semilogx(w/pi*(48e3)/2, Hdb);
以上是关于在 MATLAB 中绘制频率响应,x 轴为对数刻度的主要内容,如果未能解决你的问题,请参考以下文章