我试图使用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的音调时,我得到了这个情节:
现在我播放粉红噪声,并添加这一小部分代码将其转换为dB,这样我就可以得到频率响应曲线:
dbX = db(X);
plot(f,dbX)
我希望(或者我的目标是......)一个频率响应曲线(例如,你可以在谷歌图片上找到,我没有超过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
计算刺激信号(即参考音频波形)和响应(用麦克风测量的)之间的传递函数。