FFT算法坐標軸優化:
對于MATLAB離散處理信號頻域分析,我們一般會使用FFT,及快速傅里葉算法來實現,但是實際使用時需要對
坐標軸以及幅值進行調整,以使繪出的頻譜圖更具有直觀性,下面給出個人習慣用的代碼如下:
function [ ] = fftplot(hObject, eventdata, handles,h, x, Fs ) % x :輸入信 h:所繪制的畫板句柄 Fs:采樣頻率 L = length(x); NFFT = 2^nextpow2(L); %確定FFT變換的長度 y = fft(x, NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2+1); %頻率向量 axes(h); %指定畫板 plot(f, 2*abs(y(1:NFFT/2+1))); %繪制頻域圖像 grid on; title(頻譜圖'); xlabel('Frequency (Hz)'); ylabel('|y(f)|'); 由于這個是個人在GUI中使用的,因此有hObject, eventdata, handles這三個參數,具體GUI使用可以看附件 NFFT = 2^nextpow2(L); 這一步就是將FFT點數調整至2的冪次方,來基2算法來加快FFT速度 y = fft(x, NFFT)/L;除以L是為了調整幅值,使其與實際幅值一致 接下來是回聲的產生,分單回聲和多回聲: 單回聲代碼如下: y = handles.y; Fs = handles.Fs; s = round(get(handles. slider17,'value')*length(y)); set(handles.text37,'string',num2str(s)); a= get(handles. slider18,'value'); Bz=[1,zeros(1,s),a]; Az=1; y1=filter(Bz,Az,[y;zeros(length(y),1)]); axes(handles.axes3); plot(y1,'linewidth',2); grid on; h = handles.axes4; fftplot( hObject, eventdata, handles,h,y1, Fs); y是音頻數據,Fs為采樣頻率,使用load 函數加載一個音頻即可得到 s 是回聲延時系數 a 是衰減系數 Bz=[1,zeros(1,s),a]; Az=1; y1=filter(Bz,Az,[y;zeros(length(y),1)]); y1 即為疊加了單回聲的音頻 sound(m*y1,n*Fs)即可播放,m為音量控制系數,n為播放速度控制系數 下面是多回聲的: function pushbutton17_Callback(hObject, eventdata, handles) % hObject handle to pushbutton17 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) fs = handles.Fs; %多回聲 y = handles.y; N = handles.chong; s = round(0.2*length(y)); a= 0.5; Bz=[1,zeros(1,s)*N,a^N]; Az=[1,zeros(1,s),a]; y1=filter(Bz,Az,[y;zeros(2*length(y),1)]); axes(handles.axes3); plot(y1,'linewidth',2); grid on; sound(y1,fs); guidata(hObject,handles); N為多回聲的重數

最后面給出使用MATLAB錄音的一段GUI程序: function pushbutton13_Callback(hObject, eventdata, handles) % hObject handle to pushbutton13 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) num = [8000, 11025, 22050,44100]; value = get(handles.popupmenu3,'value'); Fs = num(value); handles.rFs = Fs; handles.R = audiorecorder(Fs, handles.bits , handles.channel) ; record(handles.R); guidata(hObject,handles);
function pushbutton14_Callback(hObject, eventdata, handles) % hObject handle to pushbutton14 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) stop(handles.R); %play(handles.R); %audiowrite('myaudio.wav'); guidata(hObject,handles);
function pushbutton15_Callback(hObject, eventdata, handles) handles.y= getaudiodata(handles.R); handles.Fs =handles.rFs; y = handles.y; Fs = handles.Fs; sound(a*y,v*Fs);
簡單來說,就是用audiorecorder和record開始錄音,stop停止錄音 但是網上大部分資料顯示可以使用PLAY 函數來播放音頻,但是可能是由于個人MATLAB不夠給力的 原因,用play只有電流聲音,于是改用getaudiodata和sound來播放,效果還不錯

以上的部分都只是個人做的一個關于數字信號處理課程設計的部分內容,還做了一點關于音頻均衡器和濾波方面的內容有興趣的話可以下載附件來看看,嘻嘻 小弟我才疏學淺,還望各位大佬們多多包涵。
|