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

结果如下,可见效果就很好了
在这里插入图片描述
几乎没有延迟,因为麦克风是一直打开的,没有关闭

猜你喜欢

转载自blog.csdn.net/weixin_43102634/article/details/105029431
今日推荐