Matlab 实时录音(声卡)及频谱显示

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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值