這篇文章來源于DevicePlus.com英語網(wǎng)站的翻譯稿。
本文是DSP Arduino系列的續(xù)篇。上文中,我們介紹了傅里葉變換的基礎(chǔ)知識(shí),并使用MATLAB學(xué)習(xí)了如何將正弦信號(hào)從時(shí)域變換到頻域。這次,在添加了失真濾波器后,我們將在MATLAB中創(chuàng)建一個(gè)簡(jiǎn)單的GUI來記錄我們的語音信號(hào)!
硬件
? Arduino Uno
? 用于Arduino的CJMCU-9812 MAX9812L駐極體麥克風(fēng)放大器開發(fā)板
軟件
? Arduino IDE
? MATLAB
步驟3:應(yīng)用失真濾波器
在前文中,我們已經(jīng)得到了一個(gè)通過了40階低通濾波器的信號(hào)。在此步中,我們需要添加另一個(gè)會(huì)使信號(hào)失真的濾波器。這可以通過MATLAB中的filter函數(shù)來完成。您可能已經(jīng)想到了,我們還需要添加下文所示的系數(shù)。
[s,fe2,bits] = wavread(‘s’);
sound(s,fe2);
pause(9)
b = [0.1662, -0.0943, 0.2892, -0.1227, 0.2348, 0.0180, 0.0415, 0.1388, -0.0616, 0.1290, -0.0434, 0.0420, -0.0010, -0.0009, 0.0032, -0.0015, 0.0056] ;
a = [1.0000, -0.7548, 3.4400, -1.6385, 4.8436, -0.8156, 3.2813, 1.2582, 0.6571, 2.1922, -0.4792, 1.4546, -0.2905, 0.4693, -0.0208, 0.0614, 0.0120] ;
x = filter(b,a,s);
figure
plot(t1,s2,t1,x),grid
title(‘The initial signal vs the distorted signal’);
sound(x,fe2);
pause(9)
audiowrite(‘x.wav’,x,fe2);
請(qǐng)注意,s是指在上一步中應(yīng)用了低通濾波器之后獲得的信號(hào)。在圖1中,藍(lán)色信號(hào)代表原始信號(hào),綠色信號(hào)代表失真信號(hào)。與藍(lán)色信號(hào)相比,綠色信號(hào)具有較低的幅度。
圖1:重疊信號(hào)
為了進(jìn)一步進(jìn)行檢驗(yàn),我們將使用FFT算法。
為了更好地進(jìn)行比較,我們對(duì)兩個(gè)信號(hào)分別進(jìn)行了繪制。下面的兩個(gè)圖將會(huì)說明在時(shí)域和頻域中兩者之間的差異。
% s si x signals (time-frequency domain)
t1=(0:length(s)-1)/(fe2);
figure
subplot(2,1,1), plot(t1,s),grid
title(‘s signal in time domain(low-pass filter)’);
xlabel(‘Time’)
ylabel(‘Amplitude’)
t2=(0:length(x)-1)/(fe2);
subplot(2,1,2), plot(t2,x),grid
title(‘x signal in time domain(distorted)’);
xlabel(‘Time’)
ylabel(‘Amplitude’)
圖2:時(shí)域中信號(hào)失真前后圖形
在時(shí)域中,圖形發(fā)生了很大的變化:s信號(hào)幅度較小(雖然這兩張圖在視覺可能會(huì)給您一種x信號(hào)具有較高幅值的感覺)。如果您仔細(xì)看一下y軸的比例,就可以看出兩者幅度的差異。對(duì)于這一現(xiàn)象,您可能會(huì)想知道是應(yīng)用了哪種濾波,以及是什么修改方式導(dǎo)致的這些系數(shù)值。
答案可以在頻域中找到:
figure
s1 = abs(fft(s,NS));
subplot(2,1,1), plot((0:(NS-1))/NS*fe2, s1), grid
title(‘Single-Sided Amplitude Spectrum of s(t)’)
xlabel(‘Frequency (Hz)’)
ylabel(‘|s(k)|’)
x1 = abs(fft(x,NS));
subplot(2,1,2), plot((0:(NS-1))/NS*fe2, x1), grid
title(‘Single-Sided Amplitude Spectrum of x(t)’)
xlabel(‘Frequency (Hz)’)
ylabel(‘|X(k)|’)
我們應(yīng)用傅里葉變換來得到等效頻率。正如您在圖3中看到的那樣,y軸對(duì)稱的中心點(diǎn)大約是采樣率的1/2。
圖3:頻域中信號(hào)失真前后圖形
這兩個(gè)信號(hào)具有不同的頻譜
? 頂部圖像
? Y軸值約為800。
? 值達(dá)到2000 Hz后,幾乎沒有信號(hào)。
? 底部圖像:
? Y軸值約為40。
? 值達(dá)到2000 Hz后,可以觀察到仍有信號(hào)。
研究此頻率范圍內(nèi)的樣本點(diǎn)是很困難的。因此,讓我們將目標(biāo)鎖定在2000 Hz左右處,對(duì)該范圍內(nèi)的幅值進(jìn)行研究。
圖4:2500Hz附近小范圍頻率內(nèi)圖像
如果我們仔細(xì)觀察幅值變化,可以看出兩個(gè)信號(hào)具有相同的形狀,而它們?cè)趫D3中看起來并不相似。上一張圖像中的兩個(gè)信號(hào)之所以看起來不同是因?yàn)樗鼈兊淖鴺?biāo)軸比例設(shè)置不同。
從兩個(gè)圖中,我們可以觀察到振幅降低了??墒俏覀冞€是不知道濾波器的頻率響應(yīng)是什么,以及它對(duì)我們的信號(hào)帶來了其他什么變化。在這種情況下,我們使用Matlab對(duì)其進(jìn)行繪制。
[h1,w1] = freqz(b,a,NS,fe2);
figure
plot(w1,abs(h1)), grid
xlabel(‘Frequency (Hz)’)
ylabel(‘Frequency response’)
圖5:一個(gè)新型濾波器
這個(gè)新的濾波器稱為帶通濾波器。因?yàn)檫@是第一次使用該濾波器,所以在應(yīng)用之前,我們先了解一下它的一些屬性:
? 可以通過將低通濾波器電路和高通濾波器電路相連接來實(shí)現(xiàn)。
? 應(yīng)用該濾波器時(shí),濾波器通帶中的信號(hào)保持不變,而在頻帶外部的頻率分量將被衰減。
? 高通帶和低通帶上的分量將被衰減。
? 在我們的項(xiàng)目中,驗(yàn)證了2000 Hz的頻率分量發(fā)生了衰減。
? 理想的帶通濾波器具有平坦的通帶,但在我們的應(yīng)用中,如圖4所示,出現(xiàn)了一個(gè)增益(也可能發(fā)生衰減)。我們只能在理論中獲得理想的濾波器。
圖6:帶通濾波器
您可以看到,圖6中的濾波器和圖5中的濾波器具有相似的形狀。因此,我們已經(jīng)獲得了一個(gè)新的濾波器。
步驟4:創(chuàng)建GUI
作為一個(gè)實(shí)用項(xiàng)目,我們接下來將會(huì)對(duì)自己的語音信號(hào)進(jìn)行處理。對(duì)!這就是我們將要與Arduino相結(jié)合的地方。
圖7:Arduino套件
在本項(xiàng)目中,我選擇了帶有MAX9812L放大器和駐極體麥克風(fēng)的模塊。該模塊具有以下三個(gè)端子:
? VCC(2.7V至3.6V之間—由Arduino的3.3V引腳供電)
? GND(接地端—連接到Arduino接地端)
? OUT(本項(xiàng)目中連接到A0)
圖7:Arduino套件
我們不打算使用Arduino IDE串行監(jiān)視器,而是直接在Matlab中讀取傳感器值。
Arduino 代碼:
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
float voltage = sensorValue * (3.3 / 1023.0);
Serial.println(voltage);
}
我們還將使用Matlab來進(jìn)行處理。為了處理語音信號(hào),我們將創(chuàng)建一個(gè)圖形用戶界面。該圖形用戶界面中有兩個(gè)按鈕:
? 藍(lán)色(start) – 用戶開始語音記錄
? 橙色(push button)– 用戶停止通過連接到Arduino的麥克風(fēng)進(jìn)行錄音(關(guān)閉串行傳輸)。
在該程序中創(chuàng)建GUI非常容易,因?yàn)槟梢允褂猛蟿?dòng)功能來繪制連接點(diǎn)。首先,在命令窗口中輸入guide。
圖9:在Matlab中創(chuàng)建GUI
當(dāng)您點(diǎn)擊“Create New GUI(創(chuàng)建新GUI)”時(shí),將會(huì)顯示出來一個(gè)用戶友好界面。Matlab GUI不像C#或其他語言那樣需要較高的編程技能。在這里,您需要選擇要添加的塊,并對(duì)生成的代碼進(jìn)行修改。
圖10:如何在Matlab中創(chuàng)建塊
在左側(cè)菜單中包含了用于您的GUI的不同指令。對(duì)于本項(xiàng)目來說,需要的元素不會(huì)超過三個(gè),因?yàn)槲覀冎皇且獙?duì)語音信號(hào)進(jìn)行顯示而已。因?yàn)槲覀兿M谟涗浐罂梢允褂脭?shù)據(jù),所以將創(chuàng)建一個(gè)包含錄音內(nèi)容的.csv文件,該文件可用于信號(hào)處理。
在我的GUI中,我使用了:
? 坐標(biāo)軸;
? 2個(gè)按鈕;
圖11:GUI設(shè)計(jì)
該按鈕的代碼是根據(jù)按鈕的規(guī)格來構(gòu)建的。整個(gè)代碼將被上傳到GitHub上供您下載。
fid = fopen(‘signal.csv’,’w’)
S=1;
s = serial(‘COM9’);
set(s,’BaudRate’,9600);
fopen(s);
fprintf(s,’%s’,’S’);
圖12:Matlab應(yīng)用程序中的語音信號(hào)
如果您已經(jīng)完成了這一步,那么恭喜您!到此為止,我們的數(shù)字信號(hào)處理系列教程已經(jīng)結(jié)束了。我們介紹了有關(guān)信號(hào)處理的各種概念。這是一個(gè)非常具有挑戰(zhàn)性的課題,所以如果現(xiàn)在沒有對(duì)所有內(nèi)容都了解得很清楚,也不要?dú)怵H!當(dāng)您覺得在某些概念的理解上出現(xiàn)困難時(shí),您可以從網(wǎng)上大量的資源中獲取更多有關(guān)信息。隨時(shí)歡迎您對(duì)我們的工作進(jìn)行訪問和評(píng)論,并與我們分享您的成果!
審核編輯黃宇
-
matlab
+關(guān)注
關(guān)注
188文章
2990瀏覽量
232942 -
數(shù)字信號(hào)
+關(guān)注
關(guān)注
2文章
987瀏覽量
48079 -
GUI
+關(guān)注
關(guān)注
3文章
672瀏覽量
40608
發(fā)布評(píng)論請(qǐng)先 登錄
[共享] 數(shù)字信號(hào)處理及其MATLAB實(shí)現(xiàn)
數(shù)字信號(hào)處理—理論、算法與實(shí)現(xiàn)
數(shù)字信號(hào)處理及其MATLAB實(shí)現(xiàn)
數(shù)字信號(hào)處理及其MATLAB實(shí)現(xiàn)
MATLAB下的數(shù)字信號(hào)處理實(shí)現(xiàn)示例
《數(shù)字信號(hào)處理教程—MATLAB釋義與實(shí)現(xiàn)》(第2版)程序集
《數(shù)字信號(hào)處理教程—MATLAB釋義與實(shí)現(xiàn)》(第2版)課件
數(shù)字信號(hào)處理及其matlab實(shí)現(xiàn)
應(yīng)用MATlAB語言處理數(shù)字信號(hào)與數(shù)字圖像
數(shù)字信號(hào)處理及其Matlab實(shí)現(xiàn)
Matlab在數(shù)字信號(hào)處理課程設(shè)計(jì)中的應(yīng)用_李永全
數(shù)字信號(hào)處理及其Matlab的實(shí)現(xiàn)
數(shù)字信號(hào)處理第3部分—傅里葉變換

使用MATLAB進(jìn)行數(shù)字信號(hào)處理-第2部分

評(píng)論