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

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

  • 9
    点赞
  • 182
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: MATLAB是一款强大的数学计算软件,在工程学科中有着广泛的应用。GUI(图形用户界面)也是MATLAB中常用的功能之一,它可以让用户通过可视化界面来操作程序。下面,我将以MATLAB和GUI为基础,设计一个实时显示波形的应用。 一、准备工作: 1. 创建GUI界面。在MATLAB的编辑器中新建一个GUI界面,设计好界面布局和相关控件; 2. 编写代码。打开回调编辑器,根据需要编写按钮事件、图形绘制和数据处理等代码。 二、实现功能: 1. 获取数据:实时显示波形需要获取实时采集的数据,可以通过各种串口和传感器获取数据,甚至可以直接读取文件进行数据处理. 2. 数据处理:对获取的数据进行必要的数据处理,如数据滤波、数据增强和数据分析等。 3. 绘制波形:将处理好的数据进行实时绘制,用matlab中的plot函数实时更新界面,并实现缩放、平移功能,增强用户体验。 4. 增加控制:在GUI界面上增加控制按钮,例如调整波形的横纵比例、清零采样计数器、启动停止数据的采集等。 三、实现过程: 1. 设计好GUI用户界面,添加鼠标操作控件和波形绘制图像区域; 2. 在回调函数中编写实时图形绘制的程序,并通过串口、传感器或其他方式获取数据,进行必要的数据处理; 3. 界面的事件响应响应程序,例如调整纵横比例等,编写相应的回调函数进行处理; 4. 编写清除屏幕显示的程序,实现实时清屏. 综上所述,利用MATLAB和GUI设计一个实时显示波形的应用,需要通过GUI界面输入数据,进行必要的处理并绘制波形图像,增加一些控制功能,这些功能都需要编写相应的程序实现。只有设计好界面,编写出准确、高效、美观的程序,才能提高用户的体验感和程序的易用性。 ### 回答2: 在MATLAB中,可以使用GUI(图形用户界面)工具箱来设计实时显示波形的程序。 首先,需要创建一个GUI窗口,并添加一个绘图区域,用于显示波形。可以使用MATLAB中的“guide”工具来快速创建GUI窗口。 接下来,需要编写实时绘图的代码。可以使用MATLAB中的“timer”函数来定时更新绘图区域。在timer回调函数中,根据输入的数据,使用MATLAB中的“plot”函数绘制波形。 为了实现实时显示,还需要使用MATLAB中的“data queue”来缓存输入数据,并自动更新波形。 最后,需要在GUI中添加一些控件,如启动/停止按钮、数据源选择、采样率设置等。 总结而言,利用MATLAB GUI设计实时显示波形的程序,需要完成以下步骤: 1. 创建GUI窗口,添加绘图区域; 2. 编写实时绘图的代码,使用“timer”函数和“plot”函数; 3. 使用“data queue”缓存输入数据,并自动更新波形; 4. 添加控件,如启动/停止按钮、数据源选择、采样率设置等。 这样,就可以实现一个简单的实时显示波形的程序,方便进行数据分析与处理。 ### 回答3: MATLAB是一种常用的科学计算软件和编程语言,可以用于创建各种图形和界面。利用MATLAB的GUI设计功能,可以轻松创建一个实时波形显示器。 首先,需要打开MATLAB的GUI设计工具,通常命名为“GUIDE”。然后,可以从工具栏中选择各种控件,如画布(axes)、按钮(push button)、文本框(text)等等,以构建界面。通过将控件拖动到画布上并更改属性设置,可以创建自己的设计。 接下来,需要编写MATLAB代码,以控制实时波形的生成和显示。可以使用MATLAB的图形和数据处理函数,以及计时器(timer)的功能来实现这一步骤。需要考虑波形的类型、频率、振幅等方面参数,同时还需要确保波形是在实时更新的情况下显示出来的。 最后,需要测试和调试代码,以确保波形显示器在不同情况下都能正常工作。可以使用MATLAB的调试工具和输出信息来检查问题,并进行解决。 通过以上步骤,就可以利用MATLAB的GUI设计功能创建一个实时显示波形的工具。这个工具可以被用于不同类型的数据分析和实验中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值