2016-11-23 69 views
1

我試圖使用sinesweep來捕捉舒爾SM57麥克風的頻率響應。我得到使用freqz(data)的圖如下:用x軸對數刻度繪製MATLAB頻率響應

Frequency Response of Shure SM57- Derived

然而,我在尋找更多與如下所述x軸的對數標度頻率響應的(舒爾SM57的文檔中)

Frequency Response of Shure SM57- Original

如何做到恰好任何想法?它只是軸縮放?

+0

'semilogx(X,Y)'將與數刻度繪製在x軸 – jodag

+0

我們如何把數據從freqz的? X軸應以對數刻度表示,Y軸以dB刻度表示。 –

+0

關於圖表的有效性:如果您使用簡單的揚聲器 - 麥克風設置進行測量,則大多數峯值和波數通常由您的揚聲器而不是SM57確定。您是否考慮先使用校準過的測量麥克風來最終減去揚聲器的頻率響應? –

回答

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

+0

這夠好!如何將它變爲0 Hz - 20 kHz?我看到這些都是拉德/樣本。對不起,我是這個新手。 –

+0

'freqz'繪製頻率響應假設,即數據的採樣率爲1Hz(1個採樣/單位時間)。您可以用採樣率除以4來縮放semilogx'w/pi'的第一個參數。從圖中可以看出,數據的採樣率可能是48kHz,即ShureSM57的最大速率。所以你可以試試'semilogx(w/pi *(48e3)/ 4,Hdb);' – jodag

+0

哎呀,我意識到我給的數學是錯誤的。你需要除以2而不是4.所以'semilogx(w/pi *(48e3)/ 2,Hdb);' – jodag