離散時間系統的頻域分析

2021-05-25 21:22:52 字數 3869 閱讀 3967

這個實驗之前,要先弄清楚dft和dtft的區別,否則實驗過程中很難下手。

以我的理解:

dtft是把乙個離散序列分成很多細小的點,比如分成500個點,然後在每個細小的點上取某種樣本,利用2*pi/500為固定搭配係數,從1,2,3...500依次乘下去,就得到500個某種樣本點。基本上,可以看成是連續的,所以我們畫圖,用plot來畫。由於這種樣本是虛複數,所以在二維實數座標上畫圖時,要取模,相角,或取實部,虛部來畫。同時,由於這種樣本的特殊,橫座標為1/500,2/500,3/500....500/500。

而dft是乙個離散序列按照它的長度分成n個點,利用2*pi/n為固定搭配係數,從1,2,3...n依次乘下去,也就得到n個某種樣本點而已。於是,依然是乙個離散的序列,所以,我們用stem來畫它。橫座標單位為n。

%%一、計算乙個n=12的序列,y[n]=cos(n*pi/6)的dtft和dft,並分析它們之間的關係

%dtft

n=0:11;  x=cos(n*pi/6);

k=0:500;  w=(pi/500)*k; 

x=x*(exp(-j*2*pi/500)).^(n'*k);

magx=abs(x); angx=angle(x); realx=real(x); imagx=imag(x);

subplot(3,4,1); plot(w/pi,magx); grid;

xlabel('pi為單位'); ylabel('模值 '); title('(dtft)模值部分');

subplot(3,4,2); plot(w/pi,angx); grid;

xlabel('pi為單位'); ylabel('弧度'); title('(dtft)相角部分');

%dft

xk=fft(x);

subplot(3,4,3);stem(n,x);

xlabel('n為單位'); ylabel('x(n) '); title('(dft)變換前');

subplot(3,4,4);stem(n,abs(xk));

xlabel('n為單位'); ylabel('x(k) '); title('(dft)變換後');

fft是快速求dft的函式,是matlab中的系統函式,它已經為我們寫好了求dft的**,我們只需要按要求呼叫它就可以了,這很方便。

%%二、已知x1=(0.8).^n1,0

x1=(0.8).^n1;

n2=0:18; 

x2=(0.6).^n2;

%conv

nn=0:28;

y1=conv(x1,x2);

%dtft

k=0:500;

w=(pi/500)*k;

x1=x1*(exp(-j*2*pi/500)).^(n1'*k);

x2=x2*(exp(-j*2*pi/500)).^(n2'*k);

yl2=x1.*x2;

yl1=y1*(exp(-j*2*pi/500)).^(nn'*k);

d=yl1-yl2;

subplot(3,4,5); plot(w/pi,abs(yl1));

xlabel('pi為單位'); ylabel('yl1 '); title('dtft模值部分');

subplot(3,4,6); plot(w/pi,angle(yl1));

xlabel('pi為單位'); ylabel('yl1'); title('dtft相角部分');

subplot(3,4,7); plot(w/pi,abs(yl2));

xlabel('pi為單位'); ylabel('yl2 '); title('x1*x2模值部分');

subplot(3,4,8); plot(w/pi,angle(yl2));

xlabel('pi為單位'); ylabel('yl2 '); title('x1*x2相角部分');

subplot(3,4,9); plot(w/pi,abs(d)); axis([0 1 -10 10]);

xlabel('n為單位'); ylabel('yl1-yl2 '); title('差值');

這是線性卷積,在這要有清晰的思路。求兩個序列的卷積:

方法一,就是每個序列都分別求出它的dtft,然後直接相乘就得到線性卷積的結果。

方法二,就是利用函式conv,先求出沒經過dtft變化的卷積結果,然後再將這個結果直接做乙個dtft變化就可以了。在這,我們可以知道,conv這個函式,所用的引數是離散的,沒有經過變換的離散序列。

要驗證卷積定理,就是用兩種方法分別求出卷積結果,然後相減,若是0,就得到了證明。

%%三、求x1(n)=(0.8).^n,其中n屬於[0,10]與x2(n)=(0.6).^n,並且n屬於[0,18]的圓周卷積(n=20)。

%%並構造乙個計算圓周卷積的函式進行計算。

n=20;

yc=mycirconv(x1,x2,n)

%  其中函式**為:

%  function y=mycirconv(x1,x2,n)

%  x1=[x1 zeros(1,n-length(x1))];

%  x2=[x2 zeros(1,n-length(x2))];

%  n=0:1:n-1;

%  n=fliplr(n);

%  for i=1:n

%  n2=mod((n+i),n);

%  x22=x2(n2+1);

%  y(i)=x1*x22';

%  end

圓周卷積,事先必須規定圓周長度,不同的圓周長度,得到的圓周卷積結果是不一樣的。

在寫這個函式過程中,想了很久,很多方法都試過了,一些小細節改了又改,都沒能如願。最後終於弄出來,要設計乙個函式,事先一定要先弄懂它的原理。

圓周卷積,需要其中乙個序列的次序不斷輪流變化,比如原來順序1,2,3,4,第一次做卷積時順序是0,3,2,1,第二次是1,0,3,2,第三次是2,1,0,3,第四次是3,2,1,0。

所以,從上面可以看出,我們需要先把原來的序列翻轉,得到3,2,1,0,然後一次次的加1取餘,就可以得到一系列的順序了。

還有上面序列的整體賦值,在matlab中是可以實現的,比如上面的x22=x2(n2+1);就是把x2中的第n2+1個數依次搬運到x22中的第1,2,3,...個數中。

同時我們要注意,在matlab中,比如有乙個序列x,取值為0:10,那麼x(1)表示的是序列中的第1個數也就是 n=0 時 x 的值,這點要注意。

%%四、用x1,x2和上述函式驗證圓周卷積定理

x1=[x1 zeros(1,n-length(x1))];

x2=[x2 zeros(1,n-length(x2))];

nc=0:n-1;

x1=fft(x1); x2=fft(x2);

yc1=x1.*x2;

yc2=fft(yc);

d=yc1-yc2;

subplot(3,4,10); stem(nc,yc1);

xlabel('n為單位'); ylabel('yc1 '); title('by x1*x2');

subplot(3,4,11); stem(nc,yc2);

xlabel('n為單位'); ylabel('yc2 '); title('by dft');

subplot(3,4,12); plot(nc,abs(d)); axis([0 20 -10 10]);

xlabel('n為單位'); ylabel('yc1-yc2 '); title('差值');

這個驗證和上面的線性卷積的驗證大同小異,只不過這又考驗到我們的理論知識了,圓周卷積的變換是dft,而線性卷積的變換是dtft。至於為什麼,這是理論知識,這裡不再贅述了。

以下是以上程式得到的圖:

離散訊號的復頻域分析

因為單邊z變換存在侷限性 一是只能描述因果系統,二是只能分析單邊序列。能夠使得z正變換的結果x z 收斂的z值區域稱為z變換的收斂域,簡稱為roc。有限長序列 有限長序列的收斂域一般為 z 0或 z 0 右邊序列 右邊序列的收斂域一般為 左邊序列 左邊序列的收斂域一般為 雙邊序列 雙邊序列的收斂域一...

離散時間系統及離散卷積

1.dft與idft function xk dft xn,n untitled 此處顯示有關此函式的摘要 此處顯示詳細說明 n 0 1 n 1 k n wn exp 1i 2 pi n nk n k wnnk wn.nk xk xn wnnk end function xk idft xk,n u...

離散時間系統的相位響應

時域採集的訊號經過時頻變換方法都會落到頻域,表徵頻域的特性兩個指標即可實現 幅頻特性,相頻特性。這樣我們不僅要思考乙個問題,到底是系統的幅頻失真造成的後果嚴重,還是系統的相位失真造成的後果嚴重?下面我們可以用超聲波束合成的乙個例子來解釋一下 實驗中,我們發射一束超聲 假設為3mhz 掃瞄人體某個部位...