直接上代码
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