數位訊號處理第4部分-在MATLAB中創建GUI

gui in matlab

本文是DSP Arduino系列的續篇。上文中,我們介紹了傅立葉變換的基礎知識,並使用MATLAB學習了如何將正弦訊號從時域變換到頻域。這次,在添加了失真濾波器後,我們將在MATLAB中創建一個簡單的GUI來記錄我們的語音訊號!

硬體

  • Arduino Uno
  • 用於Arduino的CJMCU-9812 MAX9812L駐極體麥克風放大器開發板

軟體

  • Arduino IDE
  • MATLAB

 

步驟3:應用失真濾波器

在前文中,我們已經得到了一個通過了40階低通濾波器的訊號。在此步中,我們需要添加另一個會使訊號失真的濾波器。這可以通過MATLAB中的filter函數來完成。您可能已經想到了,我們還需要添加下文所示的係數。

 

[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);

 

請注意,s是指在上一步中應用了低通濾波器之後獲得的訊號。在圖1中,藍色訊號代表原始訊號,綠色訊號代表失真訊號。與藍色訊號相比,綠色訊號具有較低的幅度。

gui in matlab

圖1:重疊訊號

為了進一步進行檢驗,我們將使用FFT演算法。

為了更好地進行比較,我們對兩個訊號分別進行了繪製。下面的兩個圖將會說明在時域和頻域中兩者之間的差異。


% 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’)

 

gui in matlab

圖2:時域中訊號失真前後圖形

在時域中,圖形發生了很大的變化:s訊號幅度較小(雖然這兩張圖在視覺可能會給您一種x訊號具有較高幅值的感覺)。如果您仔細看一下y軸的比例,就可以看出兩者幅度的差異。對於這一現象,您可能會想知道是應用了哪種濾波,以及是什麼修改方式導致的這些系數值。

答案可以在頻域中找到:

 

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)|’)

 

我們應用傅立葉變換來得到等效頻率。正如您在圖3中看到的那樣,y軸對稱的中心點大約是取樣速率的1/2。

gui in matlab

圖3:頻域中訊號失真前後圖形

這兩個訊號具有不同的頻譜

  • 頂部圖像:
    • Y軸值約為800。
    • 值達到2000 Hz後,幾乎沒有訊號。
  • 底部圖像:
    • Y軸值約為40。
    • 值達到2000 Hz後,可以觀察到仍有訊號。

研究此頻率範圍內的樣本點是很困難的。因此,讓我們將目標鎖定在2000 Hz左右處,對該範圍內的幅值進行研究。

gui in matlab

圖4:2500Hz附近小範圍頻率內圖像

如果我們仔細觀察幅值變化,可以看出兩個訊號具有相同的形狀,而它們在圖3中看起來並不相似。上一張圖像中的兩個訊號之所以看起來不同是因為它們的坐標軸比例設置不同。

從兩個圖中,我們可以觀察到振幅降低了。可是我們還是不知道濾波器的頻率回應是什麼,以及它對我們的訊號帶來了其他什麼變化。在這種情況下,我們使用Matlab對其進行繪製。


[h1,w1] = freqz(b,a,NS,fe2);
figure
plot(w1,abs(h1)), grid
xlabel(‘Frequency (Hz)’)
ylabel(‘Frequency response’)

gui in matlab

圖5:一個新型濾波器

這個新的濾波器稱為帶通濾波器。因為這是第一次使用該濾波器,所以在應用之前,我們先瞭解一下它的一些屬性:

  • 可以通過將低通濾波器電路和高通濾波器電路相連接來實現。
  • 應用該濾波器時,濾波器通帶中的訊號保持不變,而在頻帶外部的頻率分量將被衰減。
  • 高通帶和低通帶上的分量將被衰減。
    • 在我們的項目中,驗證了2000 Hz的頻率分量發生了衰減。
  • 理想的帶通濾波器具有平坦的通帶,但在我們的應用中,如圖4所示,出現了一個增益(也可能發生衰減)。我們只能在理論中獲得理想的濾波器。

您可以看到,圖6中的濾波器和圖5中的濾波器具有相似的形狀。因此,我們已經獲得了一個新的濾波器。