在MATLAB中绘制频率响应,在x轴上使用对数刻度

时间:2016-11-23 02:27:11

标签: matlab audio signal-processing audio-recording microphone

我正在尝试使用正弦扫描来捕捉舒尔SM57麦克风的频率响应。我使用freqz(data)获得的图表如下:

Frequency Response of Shure SM57- Derived

但是,我正在寻找更多的x轴对数刻度的频率响应,如下所示(在Shure SM57的文档中)

Frequency Response of Shure SM57- Original

关于如何做到这一点的任何想法?它只是轴缩放吗?

1 个答案:

答案 0 :(得分: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

        lbls{idx} = sprintf('%d%sHz', round(ticks(idx)/(10^(3*unit))), unitLbl);
    end
end

输出图

编辑:我根据示例的某些预定义采样率添加了x轴缩放。

enter image description here