离散傅里叶变换(DFT)

离散傅里叶变换(Discrete Fourier Transform)的实质是有限长序列傅里叶变换的有限点离散采样,实现了频域离散化,使数字信号处理可以在频域采用数值运算的方法进行,增大了数字信号处理的灵活性。

一、DTF的定义

设x(n)是一个长度为M的有限长序列,则定义x(n)的N点离散傅里叶变化为:

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_python 离散傅里叶变换 直流分量


逆变换为:

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_数字信号处理_02

二、DFT与傅里叶变换的关系

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_dsp_03


上述式子说明了:DFT的X(k)是x(n)傅里叶变换X(e^jw)在区间[0,2π]上的N点等间隔采样。

三、DFT与Z变换的关系

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_python 离散傅里叶变换 直流分量_04


python 离散傅里叶变换 直流分量 离散傅里叶变换长度_python 离散傅里叶变换 直流分量_05


**上述式子说明了:DFT的X(k)是Z变换X(z)在单位圆上的N点等间隔采样

四、DFT的性质

(1)线性

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_傅里叶变换_06

(2)循环位移

设x(n)为有限长序列。长度为M,M≤N,则x(n)的循环位移为

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_数字信号处理_07


循环过程如下所示:

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_傅里叶变换_08


python 离散傅里叶变换 直流分量 离散傅里叶变换长度_dsp_09

(3)时域循环移位定理

设x(n)是长度为M(M≤N)的有限长序列,y(n)为x(n)的循环移位。即:

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_傅里叶变换_10


则:

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_数字信号处理_11


证明过程如下:

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_dsp_12


令n+m=n’,则有

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_信号处理_13


python 离散傅里叶变换 直流分量 离散傅里叶变换长度_dsp_14

(4)频域循环移位定理

同(3)

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_傅里叶变换_15

(4)复共轭序列的DFT

设x*(n)是x(n)的复共轭序列,长度为N,则

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_dsp_16


证明如下,根据DFT唯一性

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_傅里叶变换_17

五、用DFT进行谱分析的误差

(1)混叠现象:

对连续信号进行谱分析时,首先要对其采样,由时域连续变时域离散信号,再用DFT(FFt)进行谱分析。采样速率必须满足采样定理,否则会在w=π附近发生频率混叠现象。
对于Fs确定的情况,一般在采样前进行预滤波,滤除高于折叠频率Fs/2的频率成分

(2)栅栏效应:

N点DFT是在频率区间[0,2π]上对时域离散信号的频谱进行N点等间隔采样,二采样点之间的频谱是看不到的。
采用提高频率分辨率,对原序列尾部补零,增大截取长度及DFT变换区间长度等方法解决栅栏效应

(3)截断效应

对无限长序列进行谱分析时,需要将其截断 成有限长序列。
影响有
(1)泄露
(2)谱间干扰

六、用Python语言编写DFT算法

编程思路:

1、利用欧拉公式

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_dsp_18


得到

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_python 离散傅里叶变换 直流分量_19


2、幅值计算

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_信号处理_20

计算sin(0.4pin+pi/3)+10sin(0.2pin+pi/4)

代码如下:

from math import *
import numpy as np
import matplotlib.pyplot as plt
def signal(n):
    return (sin(0.4 * pi * n + pi / 3) + 10 * sin(0.2 * pi * n + pi / 4))

# 生成WN项
def wn_k(k, n, N):
    return complex(cos(2 * pi * n * k / N), sin(-2 * pi * n * k / N))

amplitude = []  # 准备一个空列表
power_spectrum = []
sums = 0

# 256点DFT,X(0)到X(255)
for k in range(0, 256):
    for n in range(1, 257):
        # n的取值为从1到256
        sums = sums + signal(n) * wn_k(k, n, 256)
    amplitude.append(sums)
    sums = 0

print(amplitude, len(amplitude))

for i in range(0, 256):
    power_spectrum.append(amplitude[i] ** 2)


plt.subplot(2, 1, 1)
plt.plot(np.abs(amplitude))
plt.title("amplitude_spectrum")
plt.subplot(2, 1, 2)
plt.plot(np.abs(power_spectrum))
plt.title("power_spectrum")
plt.show()

python 离散傅里叶变换 直流分量 离散傅里叶变换长度_信号处理_21