基於Matlab GUI的簡易數字均衡器設計
阿新 • • 發佈:2018-12-31
使用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