這個實驗之前,要先弄清楚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 掃瞄人體某個部位...