众所知周,法国的大神傅里叶可能通信和电子信息相关行业最头疼的人物,这个闹过革命,随拿破仑远征埃及的埃及总督,在回到法国的后,向法国皇家科学院递交过一篇关于三角级数论文,但是非常可惜,这篇论文并未引起大数学家高等数学中绕不开的大神——拉格朗日的注意。然而数十年过去了,随着无线电报机的出现,傅里叶变换焕发了新的生机。现在,本科大学生的两门课《信号与系统》和《数字信号处理》就是以傅里叶变换为基本研究对象。作为通信和电子信息专业的专业基础课,其上手难度可想而知,尤其是在刚学《数字信号处理》时,甚至连DFT都算不清楚。今天,笔者就送给大家一个用来专门计算《数字信号处理》中卷积和DFT的工具。

这里需要声明一下,这个计算器使用python写成,目前只能在python的环境下运行,所以没有装python的同学们要把python装上,另外,还需要tkinter和numpy、matplotlib三个库,利用pip可以轻松安装。(不会安装的同学们也不用担心,我会在下一篇文章中讲述windows如何安装pip和下载相应库)

当然,有兴趣的同学可以自己写一个卷积和dft的函数,这算是信号专业的入门了。

首先,我们展示一下计算器的外观,并简要介绍一下布局:

这个计算器最左边有两个CheckButton,用来选择计算器的主要功能:卷积还是dft,再到右边,从上往下看,先是两个Entry,分别作为待处理数据的输入口,初始化时,两个输入口都存在,当我们选中dft时,则只有输入口1,而选择卷积时,则输入口1和输入口2都存在。

往下看是两个RadioButton,用来选择是否做出计算结果的图像,以方便使用者观看。下面是四个Button,作用等到使用方法时一一解释。

最下面是一个text,用来展示输入数据和计算结果,当选择卷积功能时,则会出现 两个text,用来分别显示两组输入数据。

下面,我们来介绍一下如何使用这个计算器。

dft功能:

首先,我们要在功能区选择dft功能,这时上方会显示“已选择dft”,如果不小心将dft和卷积同时选上,则会出现“不能同时选择”。

第二步,就可以输入数据了,在输入口1输入数据,每输入完一个数据就敲击一下“Enter”键,该输入就会在下方的text中显示,并且自动空格。因为dft是数据运算,所以如果你输入的不是数字,上方就会出现红色提示“输入只能是数字”。

当数据输入完后,可以选择是否做图,这一步并不是很关键,因为不论是否做图,都会呈现数值结果。待数据输入完后,请点击输入结束,这时会出现一个“-->”符号,然后点击计算,这时如果你选择了做图,就会出现图像,如果选择不做图,则什么都没有出现,那么计算数值呢?别忘了有一个显示结果,轻点“显示结果”,就会出现一个text,而计算结果就在上面。

下面,我们来操作一遍:dft计算https://www.zhihu.com/video/1221903431230812160

计算的图像如下:

大家可能会奇怪,为什么计算出的图像有三个,其实只要仔细看一下纵坐标就可以知道,第一幅图是原序列的图像,第二幅是卷积后序列的实部,第三幅是卷积后序列的虚部,由于二维图像无法同时绘制出复数(a+bi),所以将实部和虚部分开展示。

现在,我们来介绍卷积功能。

卷积功能:

卷积和dft在操作方法上的的不同之处在于,卷积有两个原始序列,所以有两个Entry,分别作为原始序列x1和x2的输入口。

输入数据的方法同dft,这里就不再重复了,不同的是,卷积的两个原始序列分别显示在了两个不同text中,这样方便观看。数据输入完后,就点击输入结束——计算——展示结果,然后就会出现计算结果。

如图,上述数据计算结果:

现在,我们再来动手操作一遍:

卷积计算方法https://www.zhihu.com/video/1221903583496581120

我们已经介绍完了计算器的使用方法,现在我将代码开源,欢迎大家来完善功能。笔者编程能力有限,这个程序算是笔者学习gui的小试牛刀了。

import numpy as np

from tkinter import *

import matplotlib.pyplot as plt

import seaborn

root=Tk()

draw=IntVar()

draw.set(1)

f4=Frame()

lf1=LabelFrame(relief=GROOVE,text='是否做图:')

ra1=Radiobutton(lf1,text='是',variable=draw,value=1)

ra2=Radiobutton(lf1,text='否',variable=draw,value=0)

ra1.grid(row=1,column=1)

ra2.grid(row=1,column=2)

la2=Label(f4,text="请选择")

la3=Label(f4,text="功能")

la2.pack()

la3.pack()

ck1=IntVar()

ck2=IntVar()

ck1.set(0)

ck2.set(0)

cb1=Checkbutton(f4,text="dft",variable=ck1,width=4,indicatoron=1,justify='left')

cb2=Checkbutton(f4,text="卷积",variable=ck2,width=4,indicatoron=1,justify='left')

cb1.pack()

w1=Toplevel()

w1.title('计算结果')

w1.withdraw()

cb2.pack()

f4.pack(side='left')

t1=Text(width=30,height=10)

t2=Text(width=15,height=10)

t3=Text(w1,width=30,height=20)

t3.pack()

a=StringVar()

a.set('输入口1')

b=StringVar()

b.set('输入口2')

f1=Frame()

f1.pack()

la1=Label(f1,text='计算器',width=24)

la1.pack()

f2=Frame(relief=SUNKEN,bd=2)

f2.pack()

en1=Entry(f2,width=24,textvariable=a)

en1.pack()

en2=Entry(f2,width=24,textvariable=b)

en2.pack()

f3=Frame()

lf1.pack()

def c1(a):

v=a

t1.insert('insert',v)

t1.insert('insert',' ')

en1.delete(0,END)

def c1b(a):

v=a

t2.insert('insert',v)

t2.insert('insert',' ')

en2.delete(0,END)

def c2(event):

if ck1.get()==1 and ck2.get()==0:

c=t1.delete("0.0","end")

else:

c=t1.delete("0.0","end")

c=t2.delete("0.0","end")

def c3(event):

if ck1.get()==1 and ck2.get()==0:

t1.insert('insert','-->')

elif ck1.get()==0 and ck2.get()==1:

t1.insert('insert','-->')

t2.insert('insert','-->')

def c4(a):

if ck1.get()==1 and ck2.get()==0:

y=t1.get("0.0","end")

u=0

k=0

m=0

n=0

p=[]

j=[]

h=[]

x=y.split(' ')

x.remove('-->\n')

m=len(x)

while n

x[n]=int(x[n])

n=n+1

w=np.fft.fft(x)

print(w)

t3.insert('insert',w)

while k

j.append(w[k].imag)

k=k+1

while u

h.append(w[u].real)

u=u+1

draw2=a

if draw2==1:

fig,ax=plt.subplots(3,1)

ax[0].stem(range(m),x)

ax[0].set_xlabel('k')

ax[0].set_ylabel('h(k)')

ax[1].stem(range(m),h)

ax[1].set_xlabel('k')

ax[1].set_ylabel('H(k)real')

ax[2].stem(range(m),j)

ax[2].set_xlabel('k')

ax[2].set_ylabel('H(k)imag')

plt.show()

elif ck1.get()==0 and ck2.get()==1:

y1=t1.get("0.0","end")

u=0

k=0

m=0

n=0

p=[]

j=[]

h=[]

x1=y1.split(' ')

x1.remove('-->\n')

m=len(x1)

while n

x1[n]=int(x1[n])

n=n+1

y2=t2.get("0.0","end")

u=0

k=0

m=0

n=0

p=[]

j=[]

h=[]

x2=y2.split(' ')

x2.remove('-->\n')

m=len(x2)

while n

x2[n]=int(x2[n])

n=n+1

y3=np.convolve(x1,x2)

print(y3)

t3.insert('insert',y3)

draw1=a

if draw1==1:

x3=len(x1)+len(x2)-1

plt.stem(range(x3),y3)

plt.show()

elif ck1.get()==1 and ck2.get()==1:

t1.delete("0.0","end")

t1.insert('insert',"不能同时选择多种功能")

elif ck1.get()==0 and ck2.get()==0:

t1.delete("0.0","end")

t1.insert('insert',"请选择一种功能")

def c5(o,i):

if o=='1':

if i not in '0123456789 -->输入口':

la1.config(text='输入只能是数字',fg='red')

return False

else:

la1.config(text='计算器',fg='black')

return True

def c7():

if ck1.get()==1 and ck2.get()==0:

la2.config(text="已选择")

la3.config(text="dft")

t2.pack_forget()

t1.config(width=30,height=10)

en2.pack_forget()

elif ck1.get()==0 and ck2.get()==1:

la2.config(text="已选择")

la3.config(text="卷积")

t1.config(width=15,height=10)

t2.pack(side='right')

en2.pack()

elif ck1.get()==1 and ck2.get()==1:

la2.config(text="不能同")

la3.config(text="时选择")

t2.pack_forget()

t1.config(width=30,height=10)

elif ck1.get()==0 and ck2.get()==0:

la2.config(text="请选择")

la3.config(text="功能")

t2.pack_forget()

t1.config(width=30,height=10)

c6=en1.register(c5)

en1.config(validate='all',validatecommand=(c6,'%d','%S'))

c8=en2.register(c5)

en2.config(validate='all',validatecommand=(c8,'%d','%S'))

b1=Button(f3,width=5,text='清空')

b2=Button(f3,width=5,text='计算')

b3=Button(f3,width=6,text='输入结束')

b4=Button(f3,width=6,text='显示结果',command=w1.deiconify)

b1.grid(row=1,column=3)

b2.grid(row=1,column=2)

b3.grid(row=1,column=1)

b4.grid(row=1,column=4)

en1.bind('',lambda event: c1(en1.get()))

en2.bind('',lambda event: c1b(en2.get()))

b1.bind('',c2)

b3.bind('',c3)

b2.bind('',lambda event: c4(draw.get()))

cb1.config(command=c7)

cb2.config(command=c7)

f3.pack()

t1.pack(side='left')

root.mainloop()

python列表转化为数字信号的过程_如何用python写一个简单的数字信号处理计算器(文章末公开代码)?...相关推荐

  1. python列表转化为元组、集合_如何在Python中将元组列表更改为集合?

    我在Python中创建了一个函数,它返回抛出2个骰子的所有可能结果的列表. 元组列表:[(1,1),(1,2),-,(6,6)].在 然后我写了一个函数来找出两个值之和为偶数的所有元素(a),另一个函 ...

  2. python可以做机器人吗_零基础如何用Python写一个简单的WeChat机器人?(内附代码)...

    (bing图片) python这两年热火朝天,依托其众多类库,基于python的应用层出不穷,也大大降低了非计算机专业人员的入门门槛,WeChat机器人自然不在话下!-- 聪明的瓦肯人 苦于有时候总是 ...

  3. python列表转化为数字信号_python 经典数字滤波实例 Python 数字信号处理程序实现分享解...

    常用的数字滤波的方法都有哪些,写出其中三种数字经典滤波的概念,是根据傅里叶分析和变换提出的一个工程概念.根据高等数学理论,任何一个满足一定条件的信号,都可以被看成是由无限个正弦波叠加而成.换句话说,就 ...

  4. python将字符串转换为数字信号的过程_如何检测一个字符串是否可以转换为数字...

    面试题目以及相应的源代码在学习资料中,购买后请自行下载 以Python3.x为基础,解析了各种类型的Python面试题,并给出了详细的答案.同时详细解析了Python的领域之一的数据分析师需要学习的相 ...

  5. python用import xlwt出现红字_如何用python处理excel

    最近看到有很多的python课程是教人怎么用python处理excel,我看了一下价格收费还贼高...这么初级毫无水平的操作我的粉丝们就不要花钱去报课程了..我免费教你们怎么做. 首先我们先要安装两个 ...

  6. python数据透视表计数去除重复_如何用Python实现数据透视表?解除你对透视表的疑惑!...

    相信接触过Excel的小伙伴都知道,Excel有一个非常强大的功能数据透视表可以自由选择不同字段,用不同的聚合函数进行汇总,并建立交叉表格,用以从不同层面观察数据.这么强大的功能,在Python中怎么 ...

  7. 'python program'.count('p')的值是_如何用Python分析泰坦尼克号生还率?

    原标题:如何用Python分析泰坦尼克号生还率? 1912年当时世界上最大的豪华客轮泰坦尼克号在处女航中撞上冰山沉没,船上船员及乘客共有2224人,只有710人生还.当灾难突然降临时,所有人的生死瞬间 ...

  8. python缩进的用途和使用方法_如何用Python减少循环层次和缩进的技巧

    本文实例分析了Python减少循环层次和缩进的技巧.分享给大家供大家参考,具体如下: 我们知道Python中冒号和缩进代表大括号,这样写已经可以节省很多代码行数,但是可以更优化,尽可能减少循环的层次和 ...

  9. python如何绘制两点间连线_如何用 Python 绘制玫瑰图等常见疫情图

    新冠疫情已经持续好几个月了,目前,我国疫情已经基本控制住了,我们会看到很多网站都提供了多种疫情统计图,今天我们使用 Python 的 pyecharts 框架来绘制一些比较常见的统计图. 1. 玫瑰图 ...

  10. python制作微信个人二维码_如何用Python制作微信好友个性签名词云图

    前言 上次查看了微信好友的位置信息,想了想,还是不过瘾,于是就琢磨起了把微信好友的个性签名拿到,然后分词,接着分析词频,最后弄出词云图来. 1.环境说明 Win10 系统下 Python3,编译器是 ...

最新文章

  1. 2022-2028年中国三网融合产业深度调研及投资前景预测报告
  2. 并发 线程交替执行_并发与并行的区别
  3. 让Jexus支持高并发请求的优化技巧
  4. 【C++】31. Boost::circular_buffer——循环缓冲区
  5. 推荐一个好用的Chrome扩展,专门处理xml的,名叫XML Tree
  6. Haar小波变换代码实现
  7. springboot---request 中Parameter,Attribute区别
  8. [SpringBoot2]web场景_SpringBoot2_SpringMVC自动配置概览
  9. 山寨一个PetShop(Task002)——数据类库Model
  10. 电脑不能正常启动windows怎么办,电脑系统无法正常启动
  11. [bug]使用SharpZipLib遇到中文名称乱码问题
  12. 【自动驾驶轨迹规划之RRT算法】
  13. 个人收集的IT技术网站集合,涉及web前后端,大数据,UI设计等。
  14. “胡焕庸”线 - 中国人口分布地理界线
  15. html中设置粗斜体,HTML基础 b i 字体加粗 斜体
  16. Teams登录报错最全的解决方法ERROR CAA20002 caa70004
  17. iphone浏览器不支持javascript中的new Date问题
  18. AUTOCAD——拉长
  19. DJANGO后台ADMIN下拉三级联动,纯JS,没有AJAX数据库回显,目前为止最简单的做法
  20. 影视剪辑副业真的可以月入过万吗?

热门文章

  1. 笔记本电脑麦克风没有声音的解决方法
  2. JAVA 赛码网|笔试时输入输出的控制
  3. altium 不规则焊盘 创建异形焊盘方法
  4. Power BI 客户端 安装 错误
  5. Strings的用法
  6. pdf文件怎么转换成图片
  7. win10装win7装win7
  8. 50EX全球化战略布局加快,日韩版本将上线
  9. SpringBoot爬虫
  10. c语言函数的标准写法,C语言函数的两种写法变种