基于Matlab GUI的简易数字均衡器设计

版权声明:原创博客,转载请注明出处 https://blog.csdn.net/qq_37147721/article/details/85453492

使用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.csdn.net/download/qq_37147721/10888152

猜你喜欢

转载自blog.csdn.net/qq_37147721/article/details/85453492