使用matlab的GUI设计数字均衡器
一、设计GUI界面
1、新建fig文件:
2、使用左侧的控件搭建主界面:
3、可以双击控件,修改控件的属性:
例如,修改按键显示的文字为:“加载音频文件”
例如:修改滑动条的颜色:
顺便分享一个配色设计参考网站:https://colorhunt.co
再例如,修改图像显示控件的tag名字,方便编程:
4、界面设计完成之后大致是这个样子,点击绿色按键可以查看实际效果
保存之后会自动生成了两个文件,一个是balancer.fig,另一个是balancer.m。
fig文件是主界面前台设计文件,.m文件则是后台功能实现的文件。
打开.m文件,框架已经做好了,需要做的就是在控件的回调函数里实现功能。
5、若是要再修改界面,可以在左侧文件夹中右键fig文件,选择在GUIDE中打开。
二、实现功能
1、加载音频文件,显示文件的名字,绘制原始的频谱图像:
右键按键,选择查看回调,然后在m文件编辑区便跳转到对应的回调函数的位置
在后面添加如下代码:读取音频文件、计算出频谱、画在第一个图像区域、显示文件名称
[FileName] = uigetfile('*','Select the audio file');
[handles.audio , handles.audioFs ] = audioread(FileName) ;
Audio_f = abs( fft(handles.audio) );
plot( handles.audio_begin,Audio_f );
handles.audioname.String = FileName;
接着设计8个带通滤波器(1个高通、1个低通、6个带通比较合适,为了简化设计内容,都设计成带通),使用函数,代码如下:
既包含了IIR,也有FIR,名字叫fx_FIR,fs是采样频率,wc1和wc2是带通滤波器的两个截止频率,signal是输入的要滤波的信号,Y是输出。
function [ Y ] = fx_FIR( fs, wc1 ,wc2 , signal)
%===============IIR设计滤波器===============
Wn=[wc1*2 wc2*2]/fs;
[b,a]=butter(1,Wn);
Y=filtfilt(b,a,signal);
%===============FIR设计滤波器===============
%b = fir1(50, [wc1*2/fs wc2*2/fs]);
%Y = filtfilt(b,1,signal);
end
分别取出来音频中对应的频率信号:
handles.audio_100 = fx_FIR( handles.audioFs, 1 ,100 , handles.audio);
handles.audio_200 = fx_FIR( handles.audioFs, 100 ,200 , handles.audio);
handles.audio_500 = fx_FIR( handles.audioFs, 200 ,500 , handles.audio);
handles.audio_1K = fx_FIR( handles.audioFs, 500 ,1000 , handles.audio);
handles.audio_2K = fx_FIR( handles.audioFs, 1000 ,2000 , handles.audio);
handles.audio_4K = fx_FIR( handles.audioFs, 2000 ,4000 , handles.audio);
handles.audio_8K = fx_FIR( handles.audioFs, 4000 ,8000 , handles.audio);
handles.audio_16K = fx_FIR( handles.audioFs, 8000 ,20000 , handles.audio);
因为我把数据放在了handles句柄里了,最后需要更新一下这个参数:
% Update handles structure
guidata(hObject, handles);
2、获取滑动条的位置,将其当做权重加在各个频率分量上,同时,将滑动条的当前位置显示在上方的可变文字区:
%获取各个滑动条的位置
a = get(handles.Freq100 , 'Value');
b = get(handles.Freq200 , 'Value');
c = get(handles.Freq500 , 'Value');
d = get(handles.Freq1K , 'Value');
e = get(handles.Freq2K , 'Value');
f = get(handles.Freq4K , 'Value');
g = get(handles.Freq8K , 'Value');
h = get(handles.Freq16K , 'Value');
%以第一滑动条为例,显示当前位置0~100
handles.Freq100num.String = num2str( a*100 );
%获取音量滑动条的位置,控制总的输出音量
all = get(handles.audiovoice , 'Value');
%各个音频信号相加,乘以权重,乘以音量增益,绘制此时的信号的频谱
handles.now_audio = all*( a*handles.audio_100 + b*handles.audio_200 + c*handles.audio_500 + d*handles.audio_1K + e*handles.audio_2K + f*handles.audio_4K + g*handles.audio_8K + h*handles.audio_16K );
Audio_ff = abs( fft( handles.now_audio ) );
plot( handles.audio_end , Audio_ff );
%更新数据
guidata(hObject, handles);
3、最后是播放按键:
try
sound( handles.now_audio , handles.audioFs );
end
guidata(hObject, handles);
三、测试结果
1、最终界面如下:
2、点击加载音频文件按钮,选择一个音频,音频文件不要太大,最好是自己录的一句话,整首歌会有些慢(播放的时候必须等到它全部播放完成)。
文件打开后上面的图是原始信号的频谱,下面的信号是均衡之后的频谱,此时会自动播放一遍加载的音频文件。
3、拖动滑动条,可以动态看到,下方的频谱图像会发生改变,按下播放按钮,播放均衡后的音频。
4、设计完毕。
工程压缩包:https://download.youkuaiyun.com/download/qq_37147721/10888152