matlab聲音採集並實時顯示波形

直接上代碼

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

結果如下,可見效果就很好了
在這裏插入圖片描述
幾乎沒有延遲,因爲麥克風是一直打開的,沒有關閉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章