1. 程式人生 > >基於Matlab GUI的簡易數字均衡器設計

基於Matlab GUI的簡易數字均衡器設計

使用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