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

在MATLAB中用对数刻度在x轴上绘制频率响应,matlab,audio,signal-processing,audio-recording,microphone,Matlab,Audio,Signal Processing,Audio Recording,Microphone,我尝试使用正弦扫描捕捉舒尔SM57话筒的频率响应。我使用freqz(data)获得的图形如下: 但是,我希望更多的频率响应在x轴上具有对数刻度,如下所示(在舒尔SM57的文档中) 你知道怎么做吗?是否只是轴缩放 例如,您可以通过添加输出参数从freqz获得频率响应。当您使用输出参数调用freqz时,它不会创建绘图。然后,您可以使用semilogx自己创建标签 这里有一个例子 fSample = 48e3; [H, w] = freqz([1 2 1]); Hdb = 20*log10(ab

我尝试使用正弦扫描捕捉舒尔SM57话筒的频率响应。我使用
freqz(data)
获得的图形如下:

但是,我希望更多的频率响应在x轴上具有对数刻度,如下所示(在舒尔SM57的文档中)


你知道怎么做吗?是否只是轴缩放

例如,您可以通过添加输出参数从
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轴缩放


semilogx(x,y)
将在x轴上用对数标度绘制,我们如何将数据从freqz中取出?X轴应为对数刻度,Y轴应为dB刻度。关于图表的有效性:如果使用简单的扬声器麦克风设置进行测量,大多数峰值和峰值通常由扬声器而不是SM57确定。你是否考虑过首先使用校准的测量麦克风最终减去扬声器的频率响应?@哈特穆普菲辛格,这是个好问题。我已经考虑过了,但你们如何得到扬声器的频率响应呢?有什么建议吗?我一直在寻找如何校准测量话筒。还有什么建议吗?使用频率响应平坦的测量话筒(例如B&K,但也有便宜的)。然后将两个话筒放在同一位置,例如扬声器前面1米处。然后测量两个话筒。最后,估计舒尔减去测量话筒,假设后者代表loundspeaker的频率响应。这就足够了!把它调到0赫兹-20千赫怎么样?我看到这些都在rad/样本中。抱歉,我是新手。
freqz
绘制频率响应假设数据的采样率为1Hz(1个采样/单位时间)。您可以通过采样率除以4来缩放semilogx
w/pi
的第一个参数。从图中可以看出,数据的采样率可能是48kHz,这是ShureSM57的最大采样率。因此,您可以尝试
semilogx(w/pi*(48e3)/4,Hdb)Oops意识到我给出的数学是错误的。你需要除以2而不是4。So
semilogx(w/pi*(48e3)/2,Hdb)