標(biāo)題: MATLAB程序設(shè)計(FFT算法、回聲產(chǎn)生、MATLAB錄音) [打印本頁]
作者: 我是你的小號 時間: 2019-7-12 15:58
標(biāo)題: MATLAB程序設(shè)計(FFT算法、回聲產(chǎn)生、MATLAB錄音)
FFT算法坐標(biāo)軸優(yōu)化:
對于MATLAB離散處理信號頻域分析,我們一般會使用FFT,及快速傅里葉算法來實(shí)現(xiàn),但是實(shí)際使用時需要對
坐標(biāo)軸以及幅值進(jìn)行調(diào)整,以使繪出的頻譜圖更具有直觀性,下面給出個人習(xí)慣用的代碼如下:
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這三個參數(shù),具體GUI使用可以看附件
NFFT = 2^nextpow2(L); 這一步就是將FFT點(diǎn)數(shù)調(diào)整至2的冪次方,來基2算法來加快FFT速度
y = fft(x, NFFT)/L;除以L是為了調(diào)整幅值,使其與實(shí)際幅值一致
接下來是回聲的產(chǎn)生,分單回聲和多回聲:
單回聲代碼如下:
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是音頻數(shù)據(jù),F(xiàn)s為采樣頻率,使用load 函數(shù)加載一個音頻即可得到
s 是回聲延時系數(shù)
a 是衰減系數(shù)
Bz=[1,zeros(1,s),a];
Az=1;
y1=filter(Bz,Az,[y;zeros(length(y),1)]);
y1 即為疊加了單回聲的音頻
sound(m*y1,n*Fs)即可播放,m為音量控制系數(shù),n為播放速度控制系數(shù)
下面是多回聲的:
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為多回聲的重數(shù)

最后面給出使用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停止錄音
但是網(wǎng)上大部分資料顯示可以使用PLAY 函數(shù)來播放音頻,但是可能是由于個人MATLAB不夠給力的
原因,用play只有電流聲音,于是改用getaudiodata和sound來播放,效果還不錯

以上的部分都只是個人做的一個關(guān)于數(shù)字信號處理課程設(shè)計的部分內(nèi)容,還做了一點(diǎn)關(guān)于音頻均衡器和濾波方面的內(nèi)容有興趣的話可以下載附件來看看,嘻嘻
小弟我才疏學(xué)淺,還望各位大佬們多多包涵。
-
-
數(shù)字信號處理課設(shè).doc
2019-7-12 15:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
1.4 MB, 下載次數(shù): 24, 下載積分: 黑幣 -5
附帶程序源碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |