DFT和IDFT分析

基础技术 专栏收录该内容
7 篇文章 0 订阅

DFT和IDFT的意义

DFT:离散傅里叶变换
离散傅里叶变换可以将连续的频谱转化成离散的频谱去计算,这样就易于计算机编程实现傅里叶变换的计算。FFT算法的出现,使得DFT的计算速度更快。

定义

DFT的定义

x ( n ) x(n) x(n) 是一个长度为 M M M的有限长序列,则定义 x ( n ) x(n) x(n) N N N点离散傅里叶变换为
X ( k ) = D F T [ x ( n ) ] = ∑ n = 0 N − 1 x ( n ) W N k n         ( k = 0 , 1 , . . . , N − 1 ) X(k) = DFT[x(n)] = \sum\limits_{n = 0}^{N - 1} {x(n)W_N^{kn}} \ \ \ \ \ \ \ (k=0, 1, ..., N-1) X(k)=DFT[x(n)]=n=0N1x(n)WNkn       (k=0,1,...,N1)
注意: x ( n ) x(n) x(n)的离散傅里叶变换结果与变换区间长度 N N N的取值有关。

DFT的定义

X ( k ) X(k) X(k)的离散傅里叶逆变换(Inverse Discrete Fourier Transform, IDFT)为
x ( n ) = I D F T [ X ( k ) ] = 1 N ∑ n = 0 N − 1 X ( k ) W N − k n         ( n = 0 , 1 , . . . , N − 1 ) x(n) = IDFT[X(k)]=\frac{1}{N} \sum\limits_{n = 0}^{N - 1} {X(k)W_N^{-kn}} \ \ \ \ \ \ \ (n=0, 1, ..., N-1) x(n)=IDFT[X(k)]=N1n=0N1X(k)WNkn       (n=0,1,...,N1)
式中, W N = e − j 2 π N W_{N}=e^{-j\frac{2\pi}{N}} WN=ejN2π, N N N称为DFT变换区间长度, N ≥ M N \ge M NM

DFT的矩阵分析

由DFT的数学表达式可以看出:

  1. 对于每一个 X ( k ) X(k) X(k)的计算,为两个向量的内积形式

  2. 对于 k = 0 , 1 , . . . , N − 1 k=0, 1, ..., N-1 k=0,1,...,N1,则 X ( k ) X(k) X(k)的计算可以看做向量 x ( n ) x(n) x(n)一个矩阵的乘积,我们一般讲这个矩阵称作DFT矩阵 X ( k ) = D F T [ x ( n ) ] = ∑ n = 0 N − 1 x ( n ) W N k n = x ( n ) ∗ P         ( k = 0 , 1 , . . . , N − 1 ) X(k) = DFT[x(n)] = \sum\limits_{n = 0}^{N - 1} {x(n)W_N^{kn}} = x(n)*P \ \ \ \ \ \ \ (k=0, 1, ..., N-1) X(k)=DFT[x(n)]=n=0N1x(n)WNkn=x(n)P       (k=0,1,...,N1) P = [ W N 0 ∗ 0    W N 0 ∗ 1    . . . W N 0 ∗ n W N 1 ∗ 0    W N 1 ∗ 1    . . . W N 1 ∗ n . . . W N k ∗ 0    W N k ∗ 1    . . . W N k ∗ n ] P= \left[ \begin{array}{l} W_N^{0*0}\ \ W_N^{0*1} \ \ ...W_N^{0*n}\\ W_N^{1*0}\ \ W_N^{1*1} \ \ ...W_N^{1*n}\\ ... \\ W_N^{k*0}\ \ W_N^{k*1} \ \ ...W_N^{k*n}\\ \end{array} \right] P=WN00  WN01  ...WN0nWN10  WN11  ...WN1n...WNk0  WNk1  ...WNkn

  3. 同理,对于IDFT的运算,同样会有一个对应的IDFT矩阵,且和DFT矩阵有如下的关系: x ( n ) = I D F T [ X ( k ) ] = 1 N ∑ n = 0 N − 1 X ( k ) W N − k n = 1 N X ( k ) ∗ Q ( k = 0 , 1 , . . . , N − 1 ) x(n) = IDFT[X(k)]=\frac{1}{N} \sum\limits_{n = 0}^{N - 1} {X(k)W_N^{-kn}} =\frac{1}{N} X(k)*Q \\ (k=0, 1, ..., N-1) x(n)=IDFT[X(k)]=N1n=0N1X(k)WNkn=N1X(k)Q(k=0,1,...,N1) Q = [ W N − 0 ∗ 0    W N − 0 ∗ 1    . . . W N − 0 ∗ n W N − 1 ∗ 0    W N − 1 ∗ 1    . . . W N − 1 ∗ n . . . W N − k ∗ 0    W N − k ∗ 1    . . . W N − k ∗ n ] Q= \left[ \begin{array}{l} W_N^{-0*0}\ \ W_N^{-0*1} \ \ ...W_N^{-0*n}\\ W_N^{-1*0}\ \ W_N^{-1*1} \ \ ...W_N^{-1*n}\\ ... \\ W_N^{-k*0}\ \ W_N^{-k*1} \ \ ...W_N^{-k*n}\\ \end{array} \right] Q=WN00  WN01  ...WN0nWN10  WN11  ...WN1n...WNk0  WNk1  ...WNkn

  4. P P P Q Q Q的形式进行分析,则可得到如下结论:
    Q = P ∗ Q = P^{*} Q=P
    其中, P P P D F T DFT DFT矩阵, Q Q Q I D F T IDFT IDFT矩阵,且 P P P Q Q Q均为对称阵。
    P P P Q Q Q的第一行和第一列全为1。

  5. P P P Q Q Q应用于DFT和IDFT中,则有
    X ( k ) = D F T [ x ( n ) ] = x ( n ) ∗ P x ( n ) = I D F T [ X ( k ) ] = 1 N X ( k ) ∗ Q = 1 N x ( n ) ∗ P ∗ Q 1 N x ( n ) ∗ P ∗ Q = I N X(k) = DFT[x(n)] = x(n)*P \\ x(n) = IDFT[X(k)]=\frac{1}{N} X(k)*Q =\frac{1}{N} x(n)*P*Q \\ \frac{1}{N} x(n)*P*Q = I_{N} X(k)=DFT[x(n)]=x(n)Px(n)=IDFT[X(k)]=N1X(k)Q=N1x(n)PQN1x(n)PQ=IN
    P ∗ Q = N ∗ I N P*Q = N * I_{N} PQ=NIN
    说明 D F T DFT DFT矩阵 P P P I D F T IDFT IDFT矩阵 Q Q Q均为正交矩阵 A ∗ A H = E A*A^{H}=E AAH=E)。
    这两个矩阵的每一行(列)都是有个基,在N个方向上都有不同的基向量。
    因此, D F T DFT DFT I D F T IDFT IDFT都是一种正交变换。

DFT在matlab

对于matlab中的 D F T DFT DFT正变换,可使用内置函数dftmtx(n),而对于 I D F T IDFT IDFT的矩阵,可以通过 1 N ∗ d f t m t x ( N ) ∗ \frac{1}{N}*dftmtx(N)^{*} N1dftmtx(N)来得到。

相关的代码分析

%% Prepare
clc;
close all;
clear;

%% Define the signal
N = 8;
x = [0:N-1];

%% Generate the vector of n and k
N = length(x);
n = [0:N-1];
k = [0:N-1];

%% Generate the twist-factor W
imag_unit = sqrt(-1);
W = exp(-1*imag_unit*2*pi/N);

%% Generate P matrix
P = W.^(n'*k);

%% DFT transformation
X_P = x*P;
X_fft = fft(x);
X_err = norm(X_P - X_fft)

%% Generate Q matrix
Q = conj(P);

% IDFT transformation
x_Q = 1/N * X_P * Q;
x_ifft = ifft(X_fft);
x_err = norm(x_Q - x_ifft)

%% Test: P*Q == N*I_n
I_n = eye(N);
left = P*Q;
right = N*I_n;
err = norm(left - right)

%% Generate P and Q using dftmtx
P_dftmtx = dftmtx(N);
P_err = norm(P_dftmtx - P)

Q_dftmtx = conj(dftmtx(N));
Q_err = norm(Q_dftmtx - Q)

  • 2
    点赞
  • 0
    评论
  • 18
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值