用一個N點復序列的FFT同時計算兩個N點實序列離散傅里葉變換


一、功能

用一個\(N\)點復序列快速傅立葉變換算法來同時計算兩個\(N\)點實序列的離散傅立葉變換。

二、方法簡介

假設\(x(n)\)\(y(n)\)都是長度為\(N\)的實序列,為計算其離散傅立葉變換\(X(k)\)\(Y(k)\),我們將\(x(n)\)\(y(n)\)組合成一個復數序列\(h(n)\)

\[h(n) = x(n) + j y(n) \]

通過FFT 運算可以獲得\(h(n)\)的離散傅立葉變換\(H(k)\)\(H(k)\)可表示為

\[H(k) = X(k) + j Y(k) \]

根據求得的\(H(k)\),並利用DFT的奇偶共輒性,我們得到\(X(k)\)\(Y(k)\)

\[\left\{\begin{matrix}\begin{align*}X(k)&=\frac{1}{2}[H(k)+H^{*}(N-k)]\\ Y(k)&=-\frac{j}{2}[H(k)-H^{*}(N-k)]\end{align*}\end{matrix}\right. \]

三、使用方法

/************************************
	x		----長度為n。開始時存放要變換的實數據,最后存放變換結果的前n/2+1個值,
				其存儲順序為[Re(0),Re(1),...,Re(n/2),Im(n/2-1),...,Im(1)]。
				其中Re(0)=X(0),Re(n/2)=X(n/2)。根據X(k)的共軛對稱性,很容易寫
				出后半部分的值。
	y		----長度為n。開始時存放要變換的實數據,最后存放變換結果的前n/2+1個值,
				其存儲順序為[Re(0),Re(1),...,Re(n/2),Im(n/2-1),...,Im(1)]。
				其中Re(0)=Y(0),Re(n/2)=Y(n/2)。根據Y(k)的共軛對稱性,很容易寫
				出后半部分的值。				
	n		----數據長度,必須是2的整數次冪,即n=2^m。
************************************/
#include "fft.c"

void r2fft(double *x, double *y int n)
{
	int i, n1;
	double tr, ti;
	n1 = n / 2;
	fft(x, y, n, 1);
	for(i = 1; i < n1; i++) {
		tr = (x[i] + x[n - i]) / 2;
		ti = (y[i] - y[n - i]) / 2;
		y[i] = (y[n - i] + y[i]) / 2;
		y[n - i] = (x[n - i] - x[i]) / 2;
		x[i] = tr;
		x[n - i] = ti;
	}
}

fft.c文件參見快速傅里葉變換


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM