這是Gay電的一個大作業,(懂的都懂)
有人未經我同意給了代碼(好歹我也查了一個鐘頭資料,又整合了兩個鐘頭吧,既然如此那總不能造福幾個人吧,都給出去了,那就大家一起學習咯),索性直接面向全網,(當然,這段代碼其實也是借鑒了許多人的,索性給院友們當做參考批判的matlab_Coding了),

作業要求在上邊咯
其他博主也有關于類似的,我也是參考了那幾位的,不過,在這里我會以保姆級別去解讀這段代碼,
clc
clear all;
%%
%此部分是先讀取音頻,與采樣頻率的設定
%下邊的''--是檔案路徑和檔案名
[y,Fs] = audioread('D:\FFOutput\Xu嵩_New4.wav');
fprintf('默認抽樣頻率為: %d\n',Fs);
n=length(y) ;
%
T=1/Fs; %采樣周期
t=(1:n)*T; %采樣時間
%
y1=fft(y); %做FFT變換
f=(0:n-1).*Fs/n;
figure()
subplot(211)
plot(f,y1) %畫出原始信號的頻譜圖
title('原始信號頻譜圖')
xlabel('頻率Hz');
ylabel('頻率幅值');
subplot(212)
plot(t,y);
title('原始信號時域分析')
%下面加噪聲
Noise=0.1*randn(n,2);
y_Noise=y+Noise;
y_zp=fft(y_Noise,n); %對n點進行傅里葉變換到頻域
f2=Fs*(0:n/2-1)/n; % 對應點的頻率
figure(2);
plot(f2,abs(y_zp(1:n/2))); %加噪語音信號的頻譜圖
title('加噪語音信號頻譜圖');
xlabel('頻率Hz');
ylabel('頻率幅值');
%接下來仿真時域波形
t1=length(y_Noise);
t2=(1:t1)*T;
figure(3)
plot(t2,y_Noise);
title('加噪語音信號時域分析')
xlabel('時間t/s');
ylabel('音量');
%接下來
% sound(y_Noise) %這個是測驗噪聲出來的操作
Quick_Fs=2*Fs
%第三小問
R1=audiorecorder ;
%快放
sound(y,2*Fs);
record(R1);
% sound(y,2*Fs);
pause(20)
Recording5 = getaudiodata(R1);
sound(Recording5)
% start_time = 0.5;
% end_time = 20.5; %設定開始結束時間
% Y_new=y((Fs*start_time+1):Fs*end_time,1); %截取新音頻
% audiowrite('D:\FFOutput\Xu嵩_New4.wav',Y_new,2*Fs); %寫入新音頻
%慢放
R2 = audiorecorder ;
sound(y,0.5*Fs);
record(R2);
pause(20);
Recording6 = getaudiodata(R2);
sound(Recording6)
這是他開源給他好朋友的代碼,并不是我最終的,但是,幾乎和我的一樣了,我不過交上去的是一份把注釋刪去了一點,又加上了兩三條指令的東西而已,但我會以一個研究者初學者的角度去解讀這段代碼的功能(畢竟我也是個剛學matlab不是很久的fw級別人才,要是我足夠強估摸就把大作業各類課題全做出來了唉)
首先clc是清屏命令列的意思,

比如說這個,
命令列視窗出現了錯誤,看起來這些指令很煩是吧

此時我還沒按回車鍵

現在我按了
清爽了

這個叫做作業區,存盤運行出來變數值顯示給操作者看的地方 clear all的意思就是把這些存盤區里邊的東西刪掉
現在作業區就沒了,刪掉了(下圖)

這個操作有什么用呢?他便于你進行另一個程式運行的時候去檢查你運行的另一個程式的變數型別(不被上一個程式的變數所影響)
接下來就是一個問題:
[y,Fs] = audioread('D:\FFOutput\許嵩 - 放肆.wav');
這個是什么意思呢?
首先()里邊的是放的是絕對路徑,我比較喜歡絕對路徑,絕對路徑就是告訴你電腦里邊哪個檔案的具體地址,猶如你在華東,華東哪呢?華東查查工大學查查校區查查棟查查宿舍,與絕對路徑還有相類似概念叫相對路徑,相對路徑是什么意思呢?就比如說你是華東查查工查查校區查查被查查—_girl偷耳機的旁邊那棟教學樓,這個“旁邊”就是相對的意思了,如果那個人不知道偷耳機事件和查查工好大學就找不到路去那里,
所以——D:\FFOutput\許嵩 - 放肆.wav 是在D盤的FFOutput這個檔案夾下邊的許嵩 - 放肆.wav的這首歌 .wav是這首歌的檔案形式,即后綴名的意思,
所以當你運行這段代碼的時候你就得在你的電腦里改絕對路徑咯,你要開哪個音頻就用那個音頻的路徑和名字唄,
接下來解釋 audioread是一個matlab 的關鍵詞(一個封裝好的函式,這個函式出現在16版本以上好像)
[y,Fs] = audioread(filename)
[y,Fs] = audioread(filename,samples)
[y,Fs] = audioread(___,dataType)
filename就是路徑和檔案名字咯,我代碼里邊用的就是第一種,這里不解釋第二個和第三個,我代碼沒用這個,y是從這個函式運行了,出來了音頻檔案的響度(聲音的大小)Fs是出來了這個音頻檔案的頻率大小,
audioread函式支持解讀wav、mp3、aac、flac、AIFF等音頻檔案,
fprint就是C語言的printf的含義,用法都一樣,就是你想把那個變數展現出來就 (" ",xx) 唄,
n=length(y) 是什么意思呢?
length函式就是獲取一個陣列中的長度
打開作業區看看你就懂了

這就是n這個變數存盤的形式,說白了這里n就是y的長度,

接下來我就要開始要進行傅里葉變換咯,
T=1/Fs; %采樣周期
t=(1:n)*T; %采樣時間
%
y1=fft(y); %做FFT變換
f=(0:n-1).*Fs/n;
plot(f,y1) %畫出原始信號的頻譜圖
先變成周期在讓他一個一個的出來,你看 t=(1:n)*T n的作用就在這,因為我需要把x軸上弄的是頻率或者時間,所以就得用它的長度一個一個間隔地去取,遍歷,再乘以周期數,
具體一點
: 1*T 2*T 3*T......以往下去放在一個陣列里邊,這個陣列就是t,(matlab是不用定義一個陣列的,他可以默認一個空的作業變數去存盤,不要帶著c的語法去思考為什么沒有自宣告)下邊就是t存盤了什么(如圖所示)

頻率也如此操作
但為什么頻率要除以n呢?
因為我們在進行離散傅立葉變換時,是連加的,將所有采樣的點都加在了一起,所以最后要除以N
(讓二院的小伙伴們一起打開徐亞寧老師的信號與系統61頁)
plot是什么意思呢?連點畫圖唄,把一個個離散的點給他連接起來畫一個曲線出來展示
plot(x,y)x就是理論上的x軸,y就是y軸,
那title xlabel ylabel呢?
一個是給畫出來的圖起個名字 一個是給x、y軸起名字

那這個是什么意思呢?
abs(y_zp(1:n/2))
其實就是把傅里葉變換給他去半而變成實部的意思唄,(你得幅頻回應出來的是那個幅度幅值把)
那為什么要去半呢?
讓我們打開93頁信號與系統書在閱讀閱讀:

(個人理解:我不取二分之一以下,我頻譜出來的是混疊的東西那不是分析了個雞毛?)
那subplot呢?
就是把幾個圖放在一起唄,
官話介紹一下:
subplot()是將多個圖畫到一個平面上的工具,其中,m 表示 p 個圖排成 m 行,n 表示圖排成 n 列,也就是整個figure中有 n 個圖是排成一行的,一共 m 行,
如果 m=2 就是表示 2 行圖,p 表示圖所在的位置,p=1表示從左到右從上到下的第一個位置,

怒氣在這里消了一點,還行,
randn 函式
Y = randn(n):回傳一個n*n的隨機項的矩陣,如果n不是個數量,將回傳錯誤資訊,
Y = randn(m,n) 或 Y = randn([m n]):回傳一個m*n的隨機項矩陣,
我在這里 randn(n,2); n就是聲音的響度長度嘛,就得產生一個噪音一直在時域上跟著音頻信號,然后2呢我是這么理解的,這是個二維的雜音信號,(本人理論可能還需要鞏固總感覺這么解釋不太對)
然后就把雜音加到音頻上去唄,
y_Noise=y+Noise;
接下來就是重復操作了,
(我是分割線)
%快放
sound(y,2*Fs);
record(R1);
% sound(y,2*Fs);
pause(20)
Recording5 = getaudiodata(R1);
sound(Recording5)
這個是什么意思呢
這個是我參考的那個博主的介紹,非常感謝他,他讓我解決了這個錄音問題,在這里我不多廢話,直接去他博客下面看吧,下面就是網址,
https://blog.csdn.net/ShanX_s/article/details/52947440?ops_request_misc=&request_id=&biz_id=102&utm_term=matlabaudiorecorder%20;&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-52947440.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187
sound(y,Fs) sound 這個函式無非就是播放嘛,然后y是響度,音量大小,Fs就是他的頻率,兩個合在一起才是一個正常的音頻檔案唄,不信你們自己可以sound(y)和sound(Fs)欣賞欣賞,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/375084.html
標籤:其他
上一篇:標定的分類(一)
