admin管理员组文章数量:1565776
2023年12月13日发(作者:)
基于Matlabdsp工具箱的实时音频采集及频谱显示
题外话
这几天在寻找可以使 Matlab 实时采样音频并处理的函数。刚开始找到的是 网上很多例子采用的
analoginput( )
,但是目前在 64位
Windows上无法使用。其次是
audioRecorder( )
, 可以调用但缺点是每次调用都会开关一次麦克风,延迟十分严重, 无法实现要求的实时
效果。
在 Matlab 帮助文档里游荡一会儿之后,发现DSP工具箱里面有个函数
ecorder( )
,试了一下可以实时采样。创建对象之后麦
克风会一直处于开启状态,后台线程也会持续将麦克风数据写入到缓冲区,我们只需要去缓冲区读取数据就行。
效果演示
代码
PS:对于 ecorder 在新版Matlab中的变化情况,参考。
function soundtest()
timeLength=0.1; % 采样时长,单位秒
samples=timeLength*44100; % 默认采样率44100,计算采样点数
H = ecorder(...
'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.15 0.15],'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,'波形');
on=[0.040 0.48 00.92 0.48]; % 左,下,宽度,高度
on=[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
end
版权声明:本文标题:基于Matlabdsp工具箱的实时音频采集及频谱显示 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1702461660a8152.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论