《数字信号处理》——(一).DTFT、DFT(python实现)

这篇博客介绍了如何使用Python实现数字信号处理中的DTFT(离散时间傅里叶变换)和DFT(离散傅里叶变换),并展示了如何绘制频谱图。作者通过比较DTFT与DFT的关系,提供了DTFT和DFT的Python代码实现,并分别用DTFT和DFT绘制了一个门函数的频谱图,加深了对数字信号处理和Python编程的理解。
摘要由CSDN通过智能技术生成

python绘制频谱图DTFT,DFT

《数字信号处理》——(一).DTFT、DFT(python实现)

python绘制频谱图:序列的傅里叶变换(DTFT),离散傅里叶变换(DFT)

《数字信号处理》、python学习记录

涉及知识

(之前用matlab来画图,深感matlab打开、运行较慢,就学习了一下python,初学者,错误之处欢迎指正)

  1. DTFT原理;
  2. DFT原理;
  3. python matplotlib库

DTFT、DFT原理

一.DTFT

X ( e j ω ) = ∑ n = − ∞ ∞ x ( n ) e − j ω n X\left(e^{j \omega}\right)=\sum_{n=-\infty}^{\infty} x(n) e^{-j \omega n} X(ejω)=n=x(n)ejωn (式1-1)

x ( n ) = 1 2 π ∫ − π π X ( e j ω ) e j ω n d ω x(n)=\frac{1}{2 \pi} \int_{-\pi}^{\pi} X\left(e^{j \omega}\right) e^{j \omega n} d \omega x(n)=2π1ππX(ejω)ejωndω (式1-2)

二.DFT

X ( k ) = ∑ n = 0 N − 1 x ( n ) e − j 2 π N n k X(k)=\sum_{n=0}^{N-1} x(n) e^{-j \frac{2 \pi}{N} n k} X(k)=n=0N1x(n)ejN2πnk (式2-1)

x ( n ) = 1 N ∑ k = 0 N − 1 X ( k ) e j 2 π N n k x(n)=\frac{1}{N} \sum_{k=0}^{N-1} X(k) e^{j \frac{2 \pi}{N} n k} x(n)=N1k=0N1X(k)ejN2πnk (式2-2)

三.DFT与DTFT关系

X ( k ) = ∑ n = 0 N − 1 x ( n ) e − j 2 π N n k X(k)=\sum_{n=0}^{N-1} x(n) e^{-j \frac{2 \pi}{N} n k} X(k)=n=0N1x(n)ejN2πnk = X ( e j ω ) ∣ ω = 2 π N k =\left.X\left(e^{j \omega}\right)\right|_{\omega=\frac{2 \pi}{N} k} =X(ejω)ω=N2πk (式3-1)

python代码实现

	实现类dtft、dft,由(式3-1)dft类可继承类dtft,简化程序(不太会用csdn编辑器,代码缩进使用时可能需要调整)

DTFT.py

import math
import numpy as np

class dtft():
#xvalues:输入序列
    def __init__(self,xvalues=[]):
        self.yvalues = []
        self.xvalues = xvalues
#fre:频率坐标
    def xjw(self,fre = []):
#(式1-1)实现yvalues为X(jw)频谱值
        for f in fre:
            p = 0;
            for x in self.xvalues:
                p = math.e**(-1j*f*x) + p
            self.yvalues.append(p)

DFT.py

from DTFT import dtft
import math

class dft(dtft):
#Num:dft点数,self.Num序列值,self.K 序列横坐标,self.xk:存放dft计算结果,
#self.Xk():式(3-1)计算dft
    def __init__(self,Num,xvalues):
        super().__init__(xvalues)
        self.Num = Num
        self.xk = []
        self.K = list(range(0,self.Num,1))
        self.Xk()
    def Xk(self):           
        W = []
        for x in self.K:
           W.append(x*2*math.pi/len(self.K))
        self.xjw(W)
        for x in self.yvalues:
            self.xk.append(abs(x))

举例绘制一个门函数频谱 x ( n ) = R 4 ( n ) x(n)=R_{4}(n) x(n)=R4(n)

一.DTFT

import matplotlib.pyplot as plt
import math
import numpy as np
from DTFT import dtft
#dtft数据产生
xvalues = list(range(0,4,1))
#画图
DTFT = dtft(xvalues)
W = np.arange(0,10,0.01)
DTFT.xjw(W)
xjw = []
for x in DTFT.yvalues:
    xjw.append(x)、
    
plt.plot(W,xjw, linewidth = 5)
plt.title('DTFT',fontsize = 14)
plt.xlabel("w",fontsize = 14)
plt.ylabel("abs(dtft(xjw))",fontsize = 14)
plt.tick_params(axis = 'both',labelsize = 14)

在这里插入图片描述

二.DFT(32点)

import matplotlib.pyplot as plt
import math
import numpy as np
from DTFT import dtft
from DFT import dft

#dtft数据产生
xvalues = list(range(0,4,1))
N1 = 32

DFT1 = dft(N1,xvalues)

X,Y,Z = plt.stem(DFT1.K,DFT1.xk,markerfmt = "o",linefmt = "-.",basefmt = "--")
plt.setp(X,color = 'k')
plt.setp(Y,color = 'r')
plt.setp(Z,color = 'b')
plt.title('DFT',fontsize = 14)
plt.xlabel("w",fontsize = 14)
plt.ylabel("abs(dft(xjw))",fontsize = 14)
plt.tick_params(axis = 'both',labelsize = 14,which = 'major')
plt.show()

在这里插入图片描述

总结

初学python,通过python这里的使用加深了对数字信号处理相关知识和python的认识,在复习dsp过程增添了些许乐趣。
  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值