Matlab 实时录音及频谱显示
本次主要使用 Matlab 进行 GUI 编程,以实现实时录音及频谱显示。界面简单高效。
一: 创建 GUI 界面设计
matlab—>在命令行执行guide—>出现gui编辑界面,选择一个默认的空白模板—>在界面上添加两个坐标轴axes1、axes2,再添加一个按钮 改名为 ‘’录音‘’,调整好位置,这样一个简单的界面就做好了,想要美观一些,可以自己再编辑。
二:编辑应用程序
保存设计后就会自动生成一个.fig的文件和一个.m的文件。
打开.m的文件,Matlab 已默认为我们添加了按钮的 Callback 回调函数。(如有其他需求,可以自行在界面设计环节进行修改)
录音按钮的功能是:按下时,实时从声卡录入音频,并实时显示时域和频域的波形。
程序步骤:先判断当前窗口句柄的isrecording的值,然后执行if语句,当isrecording值为0时,执行if下的语句,调用record(gcf,handles)函数,record函数会另外写出来,运行的时候把它们放在同一个文件夹下就可以了。当isrecording为1时,表示当前窗口正在运行,表示在录音,这时按下这个按钮,就会执行else,将isrecording设置为0,从而停止录音。所以录音按钮第一次按下开始录音,第二次按下停止录音,都是通过设置isrecording的值实现。为了保证在界面刚打开的时候,为停止录音的状态,我们需要在打开函数function yin_OpeningFcn(hObject, eventdata, handles, varargin)中添加setappdata(gcf,’isrecording’,0)命令,即一开始设置isrecording为0;
具体程序如下:
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
isrecording=getappdata(gcf,'isrecording');
if ~isrecording
setappdata(gcf,'isrecording',1);
recorder(gcf,handles);
else
setappdata(gcf,'isrecording',0);
end
record函数的代码:(record函数的作用是建立声卡对象,控制声卡实现录音,并对录音的数据进行实时的时域和频域显示)
function aa= recorder(cf,handles)
%RECORDER Summary of this function goes here
% Detailed explanation goes here
% h=figure(soundrec);
h=cf;
thehandles=handles;
setappdata(h,'isrecording',1);
Ai=analoginput('winsound'); % 创建一个模拟信号输入对象
% 添加通道
addchannel(Ai,1);
Ai.SampleRate=48000; % 采样频率
Ai.SamplesPerTrigger=Inf; % 采样数
start(Ai); % 开启采样
warning off % 当采样数据不够时,取消警告
while isrunning(Ai) % 检查对象是否仍在运行
if getappdata(h,'isrecording')
data=peekdata(Ai,Ai.SampleRate);% 获取对象中的最后Ai.SampleRate个采样数据
plot(thehandles.axes1,data) % 绘制最后Ai.SampleRate个采样数据的图形,因此表现出来就是实时的了
set(handles.axes1,'ylim',[-1 1],'xlim',[0 Ai.SampleRate]);
y1=fft(data,2048); %对信号做2048点FFT变换
f=Ai.SampleRate*(0:1023)/2048;
bar(handles.axes2,f,abs(y1(1:1024)),0.8,'g') %做原始语音信号的FFT频谱图
set(handles.axes2,'ylim',[0 10],'xlim',[0 20000]);%设置handles.axes2的横纵坐标范围
drawnow; % 刷新图像
else
stop(Ai);
num=get(Ai,'SamplesAvailable');
aa=getdata(Ai,num);
axes(thehandles.axes1);
plot(thehandles.axes1,aa) % 绘制所有采样数据的图形
y1=fft(data,2048); %对信号做2048点FFT变换
f=Ai.SampleRate*(0:1023)/2048;
bar(handles.axes2,f,abs(y1(1:1024)),0.8,'g') %做原始语音信号的FFT频谱图
%set(handles.axes2,'ylim',[0 10],'xlim',[0 20000]);%设置handles.axes2的横纵坐标范围
drawnow; % 刷新图像
setappdata(h,'sounds',aa);
end
end
备注:采样频率及其他参数可以根据需要和声卡实际情况进行选择。
注意:确保录音设备栏目中有已存在的录音工具。否则无法正常录音。
如需去除AGC,可以调整取消麦克风增强。
三:调试运行
至此,基本的设计就已经基本完成。下一步调试运行,体验其功能吧。
四:可能出现的问题:
博主使用的是 Matlab 2014B 64bit,使用过程中报错 “错误使用 analoginput(line 46)”。
经过资料查找基本总结了两条原因:
1. 声卡驱动不正常。
如若是该原因,就卸载声卡驱动重新安装即可。
2. 64 位不兼容问题。
如果是该情况的话,只能更换使用 32 bit 的Matlab。 博主更换使用 Matlab 2015B 32bit。就解决了该情况。
下面附上 Matlab 2015B 32bit 安装及破解: 链接:http://pan.baidu.com/s/1eRWhsEe 密码:poqg