2016-11-23 21 views
1

Я пытаюсь захватить частотную характеристику микрофона Shure SM57 с помощью синусоиды. Граф, что я получен с использованием freqz(data) выглядит следующим образом:Частотная характеристика участка в MATLAB с шкалой шкалы по оси x

Frequency Response of Shure SM57- Derived

Однако, Ищу больше частотной характеристику с логарифмической шкалой в оси х следующим образом (в документации Shure SM57)

Frequency Response of Shure SM57- Original

Любая идея о том, как сделать это точно? Будет ли это просто масштабирование оси?

+0

'semilogx (х, у)' будет строить с логарифмической шкалой в оси х – jodag

+0

Как мы привносим данные из freqz? Ось X должна быть в масштабе шкалы и оси Y в дБ. –

+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 

Выходной сюжет

Изменить: Я добавил ось х масштабирования на основе некоторой заранее определенной частоте дискретизации к примеру.

enter image description here

+0

Этого достаточно! Как получить его до 0 Гц - 20 кГц? Я вижу, что все это в раде/образце. Извините, я новичок в этом. –

+0

'freqz' вычисляет предположение о частотной характеристике, что частота дискретизации данных составляла 1 Гц (1 образец/единичное время). Вы можете масштабировать первый параметр semilogx 'w/pi' по частоте дискретизации, деленной на 4. Из графика видно, что частота дискретизации данных была, вероятно, 48 кГц, максимальная скорость ShureSM57. Таким образом, вы можете попробовать «semilogx (w/pi * (48e3)/4, Hdb);' – jodag

+0

К сожалению, математика, которую я дал, была неправильной. Вам нужно разделить на 2 не 4. Так что 'semilogx (w/pi * (48e3)/2, Hdb);' – jodag