1

Sinesweep을 사용하여 Shure SM57 마이크의 주파수 응답을 캡처하려고합니다.X 축의 로그 스케일을 사용하여 MATLAB에서 주파수 응답을 플롯

Frequency Response of Shure SM57- Derived

을 그러나, I는 다음과 같이 x 축에 로그 스케일로 주파수 응답 이상을 찾고 (슈어 SM57의 문서에) 다음과 같이 I가 freqz(data)를 사용하여 수득 한 그래프이다

Frequency Response of Shure SM57- Original

정확히 수행하는 방법에 대한 어떤 생각? 그것은 단지 축 스케일링일까요?

+0

'semilogx (X, Y)' – jodag

+0

우리가 어떻게 freqz에서 데이터를 가져 않는 x 축에서 로그 스케일로 플롯 할 것인가? 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 

출력 그래프로서 정의하는 예이다 : I 첨가 x 축 스케일링 예 일부 소정의 샘플링 레이트에 기초.

enter image description here

+0

충분히 좋습니다! 0 Hz - 20 kHz로 바꾸는 것은 어떻습니까? 나는 이것들이 모두 rad/sample 인 것을보고있다. 미안 해요, 이거 처음이에요. –

+0

freqz는 데이터의 샘플링 속도가 1Hz (1 샘플/단위 시간)라고 가정 한 주파수 응답을 그립니다. 샘플링 속도를 4로 나눈 값으로 semilogx의 첫 번째 매개 변수를 확장 할 수 있습니다. 플롯에서 보면 데이터의 샘플링 속도는 아마도 ShureSM57의 최대 속도 인 48kHz 였을 것입니다. 그래서 당신은'semilogx (w/pi * (48e3)/4, Hdb)를 시도 할 수 있습니다. ' – jodag

+0

Oops는 내가 준 수학이 잘못되었다는 것을 깨달았습니다. 그래서'semilogx (w/pi * (48e3)/2, Hdb);' – jodag