获取麦克风的频率响应

时间:2017-02-20 14:01:52

标签: matlab response frequency microphone frequency-analysis

我试图使用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

现在我播放粉红噪声,并添加这一小部分代码将其转换为dB,这样我就可以得到频率响应曲线:

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

我希望(或者我的目标是......)一个频率响应曲线(例如,你可以在谷歌图片上找到,我没有超过2个链接的声誉,所以抱歉我没有'在这里使用图片链接),但我得到了这个:

this

显然,我做错了什么,但我不知道是什么......

2 个答案:

答案 0 :(得分:0)

你比你想象的更近。这里有三个提示,以便更近一点。

首先,您需要一个频域数据的对数图。使用semilogx()代替情节。

其次,您需要平滑数据。 Matlab中最简单的函数是smooth(),但有更多高级选项可以更好地满足您的需求。

最后,为了得到相对响应,从数据中减去均值。 dbx_relative = dbx-mean(dbx)

全部放在一起:

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

答案 1 :(得分:0)

使用pwelch计算刺激信号(即参考音频波形)和响应(用麦克风测量的)之间的传递函数。