直接上代碼
robj = audiorecorder(44100,16,1); %設置採樣頻率、採樣位數、通道數
recordblocking(robj,1); %採集初步數據(1s長度)
rdata = getaudiodata(robj); %獲取音頻數據
plot(rdata); %繪製波形
drawnow %刷新顯示
n = 100; %設定後續的採樣更新次數
m = 1; %設定更新間隔
while n>1
recordblocking(robj,m);
rlen = length(rdata); %獲取數據長度
rdata = [rdata ; getaudiodata(robj)]; %待顯示的數據 = 舊數據 + 新數據
plot(rdata);
drawnow
n = n-1;
end
可以自己調節裏面的參數,得到自己想要的效果
這種方法有一個缺點,當反覆調用recordblocking函數時,電腦錄音器將反覆打開,有一個短暫的時延。
效果如下:
於是我們提出第二種方法,調用matlab自帶的dsp模塊,主要用到dsp.AudioRecorder函數,直接上代碼:
這裏參考了https://blog.csdn.net/zxylv/article/details/102751960博主Panda_1875的文章
timeLength=1; % 採樣時長,單位秒
samples=timeLength*44100; % 默認採樣率44100,計算採樣點數
H = dsp.AudioRecorder(...
'DeviceName','主聲音捕獲驅動程序',...
'NumChannels' , 1 ,... % 1 個通道
'DeviceDataType', '16-bit integer',... % 16位採樣
'OutputNumOverrunSamples',true,... % 啓用溢出標誌
'SamplesPerFrame', samples); % 採樣點數
[audioIn,~] = step(H); % 第一次採樣
figure('Name','實時頻譜','MenuBar'...
,'none','ToolBar','none','NumberTitle','off');
xdata=(1:1:samples/2)/timeLength;
axes1= subplot(1,2,1);
axes2= subplot(1,2,2);
pic= plot(axes1, 1:1:samples, audioIn); % 初始化音頻波形圖
pic2= bar(axes2,xdata, xdata*0,'r'); % 初始化頻譜圖
set(axes1,'xlim', [0 samples], 'ylim', ...
[-0.01 0.01],'XTick',[],'YTick',[] );
set(axes2,'xlim', [min(xdata) max(xdata)], 'ylim',[0 6] , ...
'xscale','log','XTick',[1 10 100 1e3 1e4],'YTick',[] );
xlabel(axes2,'頻率 (Hz)');
xlabel(axes1,'波形');
axes2.Position=[0.040 0.48 00.92 0.48]; % 左,下,寬度,高度
axes1.Position=[0.040 0.06 0.92 0.25];
drawnow;
while 3>2
[audioIn,Overrun] = step(H); % 採樣
if Overrun > 0
warning(' 數據溢出 %d 位\n',Overrun);
end
ydata_fft=fft(audioIn); % 傅里葉變換
ydata_abs=abs(ydata_fft(1:samples/2));% 取絕對值
set(pic, 'ydata',audioIn); % 更新波形圖數據
set(pic2, 'ydata',log(ydata_abs)); % 更新頻譜圖數據
drawnow; % 刷新
end
結果如下,可見效果就很好了
幾乎沒有延遲,因爲麥克風是一直打開的,沒有關閉