貌似是很久沒有寫日誌了,前段時間一直很想寫關於矩陣特徵值在迭代演算法中的應用,也自己展望了一下可以從另乙個角度來分析turbo碼中的迭代演算法。但是,夢想都給人以美好的幻覺,現實逼迫你不得不踏實的做好手頭的工作,還是從最基本的最重要的傅利葉正反變換說起。
畢業設計貌似也跟**有關,所以重拾matlab來做一些小的**,先說說利用fft 和 ifft來實現傅利葉正反變換吧。看了很多資料,網上這方面的**我覺得都太凌亂,沒有把問題說清楚,有些直接就是錯誤的。下面分別以例子來說明:
例1:求在區間[-1,1]間的矩形訊號的傅利葉變換。
(1)利用抽樣產生離散時間
fs = 10;
ts = 1/fs;%時域抽樣間隔
t = [-5:ts:5];
x = zeros(size(t));
x(41) = 0.5;
x(42:60) = ones(1,19);
x(61) = 0.5;
%x = 2*sinc(2*t);
%繪製時域波形
subplot(211)
plot(t,x);
title('矩形波時域影象');
xlabel('t');
ylabel('x(t)時域大小');
(2)fft演算法實現(核心關鍵)
核心解釋:按ts的間隔(ts = 1/fs)對時間域抽樣n點並且做fft演算法後,得到的是對應與頻域[0,fs]間的n個值,頻率解析度為df = fs/n;同時我們知道fs其實對應著0頻率,fs/2對應著-fs/2即有乙個頻率反轉fftshift函式
n = 1024;%所做的fft點數,2的次冪能實現快速演算法
x = fft(x,n);%求得x(n)的dft結果
x = x/fs;%由於時域抽樣會有乙個 1/ts的衰減,所以必須乘以ts也即除以fs
df = fs/n;%頻率解析度
f = [0:df:df*(n-1)] - fs/2;%頻率倒轉
%繪製頻譜圖
subplot(212)
plot(f,fftshift(abs(x)));%把資料『迴圈倒轉』
title('傅利葉正變換');
xlabel('頻率')
結果如下:
注:由於時域取樣點較少,所以時域波形略有失真
例二:把上述矩形波傅利葉變換f(f) = 2*sinc(2f)用ifft實現傅利葉反變換,意思變換到矩形波時域影象。
(1)產生頻域抽樣波形
t = 10;%頻域取樣對應的時域 平移週期
fc = 1/t;%頻率抽樣間隔
ff = [-10:fc:10];%
f = 2*sinc(2*ff);%矩形波的頻譜
figure(2)
subplot(211)
plot(ff,f);
title('頻域取樣序列波形')
xlabel('f')
ylabel('頻率取樣大小')
(2)ifft演算法實現
核心:還是一樣,先進行ifft計算,然後實現時域倒轉,這裡要注意從頻域到fft有乙個尺度變換存在,即頻域抽樣點要乘以 頻域總寬度 題目中為10-(-10)= 20;
y = ifft(f*20);
dt = t/length(y);
tt = [0:dt:dt*(length(y)-1)] - t/2;
yef = ifftshift(abs(y));
%繪製頻域波形 對應的 時域波形
subplot(212)
plot(tt,(ifftshift(abs(y))));
title('傅利葉反變換')
xlabel('t')
結果如下:
其實,還有個問題,沒有解決,當增加ifft變換點數時,幅值會相應變換,還沒完全弄懂,主要是dsp忘得差不多了,趕緊補吧!晚安~
快速傅利葉(FFT)
快速傅利葉 更加形象的理解傅利葉變換 大概了解之後 從傅利葉級數到傅利葉變換 太大,只能裁剪為兩張 刨根問底的同學 雷德演算法 輸出序列是按自然順序排列的,而輸入序列的順序則是 位元反轉 方式排列的。也就是說,將序號用二進位制表示,然後將二進位制數以相反方向排列,再以這個數作為序號。如011變成11...
FFT快速傅利葉
description 給出兩個n位10進製整數x和y,你需要計算xy。input 第一行乙個正整數n。第二行描述乙個位數為n的正整數x。第三行描述乙個位數為n的正整數y output 輸出一行,即xy的結果。資料範圍 n 60000 乙個整數x a nan 1.a 0x a na a 0 x an...
matlab 快速傅利葉反變換函式(ifft)編寫
歡迎指正 matlab 編寫快速傅利葉反變換函式 ifft 橫向讀取資料進行變換 matlab 快速傅利葉逆變換,不夠2的整數冪的個數,末尾自動補齊0 function ret val myifft vector 因為輸入的資料可能不是2的整數次冪,補零使得計算更加方便 m,n size vecto...