標題: MATLAB程序設計(FFT算法、回聲產生、MATLAB錄音) [打印本頁]
作者: 我是你的小號 時間: 2019-7-12 15:58
標題: MATLAB程序設計(FFT算法、回聲產生、MATLAB錄音)
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來播放,效果還不錯

以上的部分都只是個人做的一個關于數字信號處理課程設計的部分內容,還做了一點關于音頻均衡器和濾波方面的內容有興趣的話可以下載附件來看看,嘻嘻
小弟我才疏學淺,還望各位大佬們多多包涵。
-
-
數字信號處理課設.doc
2019-7-12 15:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1.4 MB, 下載次數: 24, 下載積分: 黑幣 -5
附帶程序源碼
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
亚洲第一av|
www.99精品
|
国产激情一区二区三区
|
伊人网影院
|
亚洲一二三区在线观看
|
在线免费观看黄色网址
|
91电影在线
|
成人3d动漫一区二区三区91
|
亚洲欧美在线一区
|
91精品国产综合久久精品
|
亚洲成人久久久
|
亚洲欧洲中文
|
精品日韩一区
|
青青久草
|
亚洲欧美v
|
精品99在线
|
久久草在线视频
|
在线观看www高清视频
|
日本在线视频不卡
|
精品1区2区3区4区
|
一区二区三区亚洲
|
国产在线精品一区二区三区
|
国际精品鲁一鲁一区二区小说
|
久久久久久国产一区二区三区
|
亚洲精品一区二三区不卡
|
一区二区三区成人
|
亚洲天堂中文字幕
|
少妇黄色
|
欧美日韩精品一区二区
|
四虎最新地址
|
久久午夜国产精品www忘忧草
|
日韩成人av在线播放
|
99re视频这里只有精品
|
欧美日韩在线一区
|
国产三区四区
|
欧美福利
|
伊人网站在线
|
免费成人av|
久久久久国产一区二区三区不卡
|
日韩欧美国产精品一区二区三区
|
欧美a区
|