基于matlab-GUI数字音频处理系统(二)
2017-12-08 14:56
1116 查看
音频输入
该模块主要实现音频录制、音频文件选取、音频播放与暂停、导出音频、音频状态信息的显示,流程如下:音频录制
function record_start_pushbutton_Callback(hObject, eventdata, handles) handles.recObj=audiorecorder(fs,16,1); %采样率,比特率,通道数 set(handles.recObj,'StartFcn',{@recordstart_Callback,handles}, ... 'StopFcn',{@recordstop_Callback,handles}); record(handles.recObj); % 开始录音 guidata(hObject,handles); function record_stop_pushbutton_Callback(hObject, eventdata, handles) stop(handles.recObj); % 停止录音 handles.Sample=getaudiodata(handles.recObj);% 获取录音 guidata(hObject,handles);
音频录制使用
audiorecorder函数,这里只用到它的
record,
stop,
getaudiodata分别开始、停止和获取录音样本。
audiorecorder也具有
Timer的属性,这里使用了
StartFcn和
StopFcn,并分别定义了其回调函数,分别相应地函数中编写程序可以达到显示录制和停止的状态,当然还有更多用法,具体可以
help Timer。
我还考虑过动态地显示输入波形,参考了网上例程,主要使用了
recordblocking,使用循环一段一段地录制波形并显示波形,如果之后有时间编写一下。
音频文件输入
function file_choose_pushbutton_Callback(hObject, eventdata, handles) [filename,pathname]=uigetfile({'*.wav;*.mp3;*.flac', ... '音频文件(*.wav,*.mp3,*.flac)'},'选择文件');%弹出选择文件窗口 if filename==0 return else handles.Filepath=[pathname,filename]; set(handles.filepath_edit,'string',handles.Filepath);% 显示文件名 [handles.Sample,handles.Fs]=audioread(handles.Filepath);% 读取音频文件 % 若输入音频为双声道,则使用一个通道 samplesize=size(handles.Sample); if samplesize(2)>1 handles.Sample=handles.Sample(:,1); end end
uigetfile可以限制需要显示的文件格式,并输出[文件名,路径],这里注意
audioread时要将路径放在前面。使用
uigetfile后,如果打开窗口未选取文件直接取消会报错,取消后
filename返回为0,需要做一个判断,不能使用
isempty。
使用
audioread读取音频文件,以数组形式存储样本,纵向为幅值,横向为通道,这里我只是用单声道,如上述代码。
音频播放
handles.player=audioplayer(handles.CSample,handles.Fs);
音频播放与录音相似,使用
audioplayer,关于显示播放状态与动态显示播放波形的思路一项。
这里我使用了handles.CSample创建一个样本副本,之后对其进行一些音频处理,播放处理后的音频。
音频输出
该模块用于将处理后的音频输出保存,流程如下:音频传递
参考前一篇GUI与GUI之间参数传递音频输出
function generate_pushbutton_Callback(hObject, eventdata, handles) % 生成音频 if isempty(filename)||isempty(handles.foldername) set(handles.state_text,'String','请输入完整信息!'); else audiowrite([handles.foldername,'\',filename,format], ... handles.putSample, ... Fs, ... 'BitsPerSample',bps); guidata(hObject,handles); end
为了保证不出错,需要加一个条件,当参数没有完整输入进行提示。
为了使输出界面默认采样率为输入音频采样率,在
putfile_OpeningFcn加入
handles.putFs=varargin{2}; str=get(handles.Fs_popupmenu,'String'); for val=1:5 if str2double(str{val})==handles.putFs break end end set(handles.Fs_popupmenu,'Value',val);
音频分析
该模块用于求样本的均值与方差,绘制时域、频域等波形,流程如下if ~isempty(sample) sample_length=length(sample); t=(0:sample_length-1)/fs; % 时间 nfft=pow2(nextpow2(sample_length));% fft点数,基2fft取2的幂次方提高速度 switch wavetype
由于基2fft的采样点数(nfft)需为2的倍数,如果不为整数会自动补零,这样会降低速度,所以这里使用
nextpow2和
pow2将nfft变为2的倍数。
幅频
case 2 fft_sample=fft(sample,nfft); y=abs(fft_sample)/nfft; y0=fftshift(y);% 循环移位,取中间为0 f0=(-nfft/2:nfft/2-1)*(fs/nfft); plot(ax,f0,y0);
由于fft后得到的是共轭对称的两部分分量,幅值为时域的一半(除了0处直流分量),而由于对序列作dft后能量会增大(原因后面总结),幅值需要除以nfft。再将图像进行循环移位,使图像以零y轴为中心对称。
相频
case 3 fft_sample=fft(sample,nfft); f0=(-nfft/2:nfft/2-1)*(fs/nfft); ph_y0=fftshift(fft_sample); phase=unwrap(angle(ph_y0));% 矫正相角跳变范围在pi以内 plot(ax,f0,phase);
使用
angle求出相频响应后,相位变化在2pi之间,图像像噪声波形一样很乱,难以看出变化趋势,需要使用
unwrap函数使得相位变化在pi内,这样图像基本上就是单调的。原理如下图
瀑布图
case 5 axes(ax); spectrogram(sample,1024,512,nfft,fs); colorbar(ax);
瀑布图即声谱图,使用
spectrogram可以直接创建声谱图,但是在GUI中绘制时需要注意添加
Toolbar中的
Rotation,不然无法显示瀑布图。
spectrogram用到的算法是基于短时傅里叶变换的(SFFT),其主要原理是使用
窗函数(Hamming)取短时段样本作fft,不断平移窗,将一个样本分成多个窗。由于加上汉明窗丢失了两边的信息,移窗时和上一位置部分重叠可以得到丢失的信息,这样不断加窗并作fft就近似得到时间、频率、幅度相关联的声谱图。
具体格式为:
[S,F,T,P]=spectrogram(x,window,noverlap,nfft,fs)
当无输出时会绘制瀑布图,有输出时输出相应的参数,这里只介绍无输出,各参数介绍如下(具体参考
help spectrogram):
参考仿matlab的spectrogram函数(STFT)
参数 | 含义 | 介绍 |
---|---|---|
x | 输入信号 | x数据量不要太大,否则运行时间过长或无法运行 |
window | 窗函数 | 当为整数时,使用Hamming窗,值为其长度,窗越小,时域特性越明显,但fft点数越少,频域特性越不明显 |
noverlap | 窗与窗重叠点数 | 默认为窗长一半,值小于窗长,越接近窗长,时域特性越好,运算量也越大 |
nfft | fft采样点数 | |
fs | 采样率 |
关于作DFT后能量增大的理解(作fft后要除nfft)
参考关于FFT的结果为什么要除以N首先,离散付立叶变换的定义本身比连续付立叶变换少了一个dt(采样时间间隔);
然后,对于单频率成分的信号来说,经过矩形窗截断后的频谱在其信号频率处将放大T(做谱时间长度)倍,同样,对于相隔较远的多频率成分信号来说,相应的频率成分的幅值均将因截断而被放大T倍。
综合考虑这两种原因的话,也就是说我们用FFT做出的谱实际上是放大了T/dt=N(做谱点数)倍,因此,必须将此结果除以N。
相关文章推荐
- 基于matlab的数字图像处理GUI设计
- 基于Matlab的歌曲音频信号采样及其处理(上)
- 基于GUI的简易图像处理系统设计与实现
- 基于MATLAB GUI的图像处理软件平台的开发(转自深寒的博客)
- 基于matlabGUI的语音处理
- 基于MATLAB的GUI(Graphical User Interface)音频实时显示设计
- 数字图像处理:基于MATLAB的车牌识别项目 标签: 图像处理matlab算法 2017-06-24 09:17 98人阅读 评论(0)
- 数字图像处理:基于MATLAB的车牌识别项目
- 基于matlab的GUI图像处理
- 数字信号处理实践——基于matlab的音频信号分析即处理
- 一种基于DSP的音频实时处理系统
- 基于MATLAB的数字图像处理之直方图处理
- 数字图像处理——Matlab GUI与灰度变换函数
- 基于MATLAB的音频信号处理技术实现
- 基于Matlab的图像处理GUI
- 数字图像处理实验(10):PROJECT 05-01 [Multiple Uses],Noise Generators 标签: 图像处理MATLAB 2017-05-26 23:36
- 基于matlab的音频波形实时採集显示 v0.1
- 基于WebRTC的Android数字楼宇对讲系统回声消除
- 基于Matlab的图像分块处理
- [数字图像处理]常见噪声的分类与Matlab实现