找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3881|回復: 0
收起左側(cè)

MATLAB程序設(shè)計(FFT算法、回聲產(chǎn)生、MATLAB錄音)

[復制鏈接]
ID:432932 發(fā)表于 2019-7-12 15:58 | 顯示全部樓層 |閱讀模式
FFT算法坐標軸優(yōu)化:
對于MATLAB離散處理信號頻域分析,我們一般會使用FFT,及快速傅里葉算法來實現(xiàn),但是實際使用時需要對
坐標軸以及幅值進行調(diào)整,以使繪出的頻譜圖更具有直觀性,下面給出個人習慣用的代碼如下:
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點數(shù)調(diào)整至2的冪次方,來基2算法來加快FFT速度
y = fft(x, NFFT)/L;除以L是為了調(diào)整幅值,使其與實際幅值一致



接下來是回聲的產(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)容,還做了一點關(guān)于音頻均衡器和濾波方面的內(nèi)容
有興趣的話可以下載附件來看看,嘻嘻
小弟我才疏學淺,還望各位大佬們多多包涵。



數(shù)字信號處理課設(shè).doc

1.4 MB, 下載次數(shù): 24, 下載積分: 黑幣 -5

附帶程序源碼

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表