離散傅里葉變換


一、功能

計算復序列的離散傅里葉變換(DFT)和離散傅里葉反變換(IDFT)。

二、方法簡介

序列\(x(n)(n=0,1,...,N-1)\)的離散傅里葉變換定義為

\[X(k)=\sum_{n=0}^{N-1}x(n)e^{-j\frac{2\pi nk}{N}} \]

\(x(n)=a(n)+jb(n),X(k)=A(k)+jB(k),Q=2\pi/N\),則上式變為

\[A(k)+jB(k)=\sum_{n=0}^{N-1}[a(n)+jb(n)][cos(Qnk)-jsin(Qnk)] \]

\[\begin{matrix}A(k)=\sum_{n=0}^{N-1}[a(n)cos(Qnk)+b(n)sin(Qnk)]\\ B(k)=\sum_{n=0}^{N-1}[b(n)cos(Qnk)-a(n)sin(Qnk)]\end{matrix} \]

序列\(X(k)\)的離散傅里葉反變換定義為

\[x(n)=\frac{1}{N}\sum_{k=0}^{N-1}X(k)W_{N}^{-nk}, \qquad n=0,1,...,N-1 \]

它與離散傅里葉正變換的區別在於將\(W_N\)改變為\(W_N^{-1}\),並多了一個除以\(N\)的運算。計算公式如下

\[\begin{matrix}a(n)=\frac{1}{N}\sum_{k=0}^{N-1}[A(k)cos(Qnk)-B(k)sin(Qnk)]\\ b(n)=\frac{1}{N}\sum_{k=0}^{N-1}[B(k)cos(Qnk)+A(k)sin(Qnk)]\end{matrix} \]

三、使用說明

是用C語言實現離散傅里葉變換(DFT)的方法如下:

/************************************
	x       ---一維數組,長度為n,存放要變換數據的實部。
	y       ---一維數組,長度為n,存放要變換數據的虛部。
	a       ---一維數組,長度為n,存放變換結果的虛部。
	b       ---一維數組,長度為n,存放變換結果的虛部。
	n 		---數據長度。
	sign 	---當sign=1時,子函數計算離散傅里葉正變換;當sign=-1時,子函數計算離散傅里葉反變換
************************************/
#include "math.h"

void dft(double *x, double *y, double *a, double *b, int n, int sign)
{
	int i;
	int k;
	double c;
	double d;
	double q;
	double w;
	double s;

	q = 6.28318530718 / n;
	for(k = 0; k < n; k++) {
		w = k * q;
		a[k] = 0.0;
		b[k] = 0.0;
		for(i = 0; i < n; i++) {
			d = i * w;
			c = cos(d);
			s = sin(d) * sign;
			a[k] += c * x[i] + s * y[i];
			b[k] += c * y[i] - s * x[i];
		}
	}
	if(sign == -1) {
		c = 1.0 / n;
		for(k = 0; k < n; k++) {
			a[k] = c * a[k];
			b[k] = c * b[k];
		}
	}
}


免責聲明!

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



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