2017-02-20 13 views
3

私は自分のPCに接続したマイクから、matlabを使って周波数応答曲線を得ようとしています。マイクの周波数応答を得る

私は最終的なコードを手に入れるのはかなり終わったと思いますが、私は何か不足していると思います。

close all, clear all, clc 

x = 5;      % seconds recording 
Fs = 44100;     % Sampling frequency 
T = 1/Fs;      % Sample time      
L= x*1000;     % Length of signal 
t = (0:L-1)*T;    % Time vector 


% Record your voice for 'x' seconds. 
recObj = audiorecorder(Fs, 24, 1); 
disp('Start of Recording.'); 
recordblocking(recObj, x); 
disp('End of Recording.'); 
% Store data in double-precision array. 
myRecording = getaudiodata(recObj); 

NFFT = 2^nextpow2(L); % Next power of 2 from length of y 
fourier = fft(myRecording); 
Y = fft(myRecording,NFFT)/L; 
f = Fs/2*linspace(0,1,NFFT/2+1); 
X = 2*abs(Y(1:NFFT/2+1)); 
samples = get(recObj,'TotalSamples'); 

plot(f,X) 
title('Single-Sided Amplitude Spectrum) 
xlabel('Frequency (Hz)') 
ylabel('|Y(f)|') 

コードのこの部分は、私が思う正しいです:

は、これは私が今持っているものです。私は5kHzのの音を再生するとき は例えば、私はこのプロットを得る: this

今、私はピンクノイズを再生し、デシベルに変換するコードのこの小さな部分を追加しますので、私は周波数応答曲線を得ることができます。

dbX = db(X); 
plot(f,dbX) 

私は期待して(または私の目標です。)周波数応答曲線(あなたがたとえばGoogle画像検索で見つけることができるように、私は2つの以上のリンクのための十分な評判を持っていないので、申し訳ありません、私は」なかったのトンここに画像リンク)を使用しますが、私の代わりにこれを得た:

this

明らかに私が何か間違ったことをやっているが、私はあなたが思うよりも近いものを...

+0

こんにちは、私はこれについてあまりよく分かりませんが、なぜピンクノイズの周波数プロットが間違っていますか?あなたは何を期待していますか? –

+0

私の目標は、このようなものを得ることです:http://www.acoustics.salford.ac.uk/acoustics_info/microphones/microphones_files/image013.jpg 鉱山は0dB付近でさえも、フラットラインでもない.. –

+2

それは信号のスケーリングの問題に過ぎません。プロットには「相対的な応答」と書いてあることにも注意してください。 – mpaskov

答えて

0

知りません。ここに少し近づくための3つのヒントがあります。

まず、周波数ドメインデータの対数プロットが必要です。プロットの代わりにsemilogx()を使用してください。

第2に、データをスムーズにする必要があります。 Matlabでこれを行うための最も簡単な関数はsmooth()ですが、より高度なオプションがあり、必要に応じて最適化することができます。

最後に、相対的な応答を得るには、データから平均を差し引きます。 dbx_relative = dbx-mean(dbx)

はすべて一緒にそれを置く:

dbX = db(X); 
relative_dbx = dbx-mean(dbx); 
smoothed_dbx = smooth(relative_dbx); 
semilogx(f,smoothed_dbx); 
0

使用pwelchを刺激信号(すなわち、参照オーディオ波形)と応答(あなたはマイクを使って測定するもの)との間の伝達関数を計算します。

関連する問題