小学期的《信号与系统》课,要求写一个频率计数器,下面是我个人理解的频率计数

傅里叶变换的代码

# coding=utf-8
import numpy as np
from scipy.io import wavfile
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt class FrequencyCounter():
def loaddata(self, filename):
try:
samplerate, channels = wavfile.read(filename)
self.data = np.mean(channels, axis=1)
except:
raise ValueError, 'Data Error' def fft(self, windowsize=4096, samplerate=44100, overlapratio=0.5):
try:
self.res = plt.specgram(self.data,
NFFT=windowsize,
Fs=samplerate,
window=mlab.window_hanning,
noverlap=int(windowsize * overlapratio))[0]
#傅里叶变换,参数是滑动窗口大小和样例频率 from numpy.core.umath_tests import inner1d #计算内积
for i in xrange(len(self.res)):
self.res[i] = inner1d(self.res[i], self.res[i])
#plt.plot([x for x in xrange(len(self.res))],self.res)
except:
raise ValueError, 'No Data for FFT' def mainfrequency(self):
def compare(a, b):
return int(a[0][0] < b[0][0]) sortlist = [i for i in range(len(self.res))]
for i in range(len(sortlist)):
sortlist[i] = (self.res[i], i)
sortlist.sort(lambda x, y: cmp(sum(x[0]), sum(y[0]))) #按照内积大小结果排序
#for i in sortlist[:200]:
#print i[1]
return sortlist[:5] def draw(self):
'''
画图,为GUI提供图片
'''
#plt.figure(figsize=(8,4))
plt.plot([i for i in xrange(len(self.data))], self.data)
plt.title(u'音频信号波形',fontproperties='SimHei')
#plt.show()
plt.savefig('wave.jpg',dpi=70)
plt.cla()
plt.plot([i for i in xrange(len(self.res))], self.res)
plt.title(u'音频信号频谱分析',fontproperties='SimHei')
#plt.show()
plt.savefig('frequency.jpg',dpi=70) if __name__ == '__main__':
p = FrequencyCounter()
p.loaddata('python-audio\\output2.wav')
p.fft()
p.draw()

PyQt4开发GUI的代码

# -*- coding: utf-8 -*-

from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
import frequency_counter2
p = frequency_counter2.FrequencyCounter()
class UI(QDialog):
def __init__(self, parent=None):
super(UI, self).__init__(parent)
self.txt = QLineEdit()
self.bt_ad = QPushButton(u"选择路径")
self.bt_a = QPushButton(u"分析")
self.txtout = QTextEdit()
self.pic1 = QLabel()
self.pic2 = QLabel()
lay = QGridLayout() #网格布局
lay.addWidget(self.txt, 1, 1)
lay.addWidget(self.bt_ad, 1, 2)
lay.addWidget(self.bt_a, 2, 1, 1, 2)
lay.addWidget(self.pic1, 4, 1, 3, 3)
lay.addWidget(self.pic2, 7, 1, 3, 3)
self.setLayout(lay)
self.connect(self.bt_a, SIGNAL("clicked()"), self.analy)
self.connect(self.bt_ad, SIGNAL("clicked()"), self.addr) def analy(self):
#self.txtout.setText("test")
pix1 = QPixmap("wave.jpg")
pix2 = QPixmap("frequency.jpg")
self.pic1.setPixmap(pix1)
self.pic2.setPixmap(pix2) def addr(self):
fname = QFileDialog.getOpenFileName(self, 'Open file')
print fname
p.loaddata(fname)
p.fft()
p.draw()
self.txt.setText(fname) if __name__ == "__main__":
app = QApplication(sys.argv)
ui = UI()
ui.setWindowTitle(u"音频信号频率分析")
ui.show()
app.exec_()

运行时界面



基于傅里叶变换和PyQt4开发一个简单的频率计数器的更多相关文章

  1. 基于ACE的TAO开发---一个简单的入门实例-----VS2008(二)

    上一节已经说了如何编译idl文件.现在就用编好的文件来写一个最小的corba小程序的.程序分为服务器程序和客户端程序. 说明下,代码是<基于C++CORBA高级编程>一书中的例子. 1.首 ...

  2. 基于ACE的TAO开发---一个简单的入门实例-----VS2008(一)

    万事开头难,不管做什么事最开始总是最困难的,一旦上手了就好了. 这也是我自己学习corba编程的一点经验和心得.下面的例子主要是保证读者跟着走能立马看到效果. 1.机器上的TAO是实现已经装好的开发版 ...

  3. 如何开发一个简单的HTML5 Canvas 小游戏

    原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...

  4. 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务

    [源码下载] 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后 ...

  5. Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状)

    Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状) 本篇博客来给大家介绍怎样使用Lua这门语言来开发一个简单的小游戏-记数字踩白块. 游戏的流程是这种:在界面上生成5个数1~5字并显 ...

  6. Python开发一个简单的BBS论坛

    项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...

  7. 作业1开发一个简单的python计算器

    开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...

  8. django学习-11.开发一个简单的醉得意菜单和人均支付金额查询页面

    1.前言 刚好最近跟技术部门的[产品人员+UI人员+测试人员],组成了一桌可以去公司楼下醉得意餐厅吃饭的小team. 所以为了实现这些主要点餐功能: 提高每天中午点餐效率,把点餐时间由20分钟优化为1 ...

  9. 基于SOUI开发一个简单的小工具

    基于DriectUI有很多库,比如 Duilib (免费) soui (免费) DuiVision (免费) 炫彩 (界面库免费,UI设计器付费,不提供源码) skinui (免费使用,但不开放源码, ...

随机推荐

  1. 4.Windows Server2012 R2里面部署 MVC 的网站

    网站部署之~Windows Server | 本地部署:http://www.cnblogs.com/dunitian/p/4822808.html#iis 后期会在博客首发更新:http://dnt ...

  2. UIViewController生命周期-完整版

    一.UIViewController 的生命周期 下面带 (NSObject)的方法是NSObject提供的方法.其他的都是UIViewController 提供的方法. load   (NSObje ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(72)-微信公众平台开发-消息处理

    系列目录 前言 Senparc.Weixin.MP SDK提供了MessageHandler消息处理类 在作者的Wiki中也详细说明了如何定义这个类,下面我们来演示,消息的回复,及效果 了解Messa ...

  4. 运用php做投票题,例题

    要求大概是这样的,有一个题目,题目下面是复选框,要求点完复选框提交后会变成进度条,各选项的进度条百分比,和投票数量 首先还是要在数据库建两张表,如下: 要完成这个题目,需要建两个页面 <!DOC ...

  5. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  6. 用神奇的currentColor制作简洁的颜色动画效果

    先上一个兼容性总结图:老版本ie可以直接用复杂方法了,套用某表情包的话:  2016年了,做前端你还考虑兼容IE6?你这简直是自暴自弃! 好了,知道了兼容性,我们可以放心的使用了. 在CSS3中扩展了 ...

  7. Python多线程爬虫爬取电影天堂资源

    最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...

  8. iOS 多线程之GCD的使用

    在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...

  9. Prometheus 系统监控方案 一

    最近一直在折腾时序类型的数据库,经过一段时间项目应用,觉得十分不错.而Prometheus又是刚刚推出不久的开源方案,中文资料较少,所以打算写一系列应用的实践过程分享一下. Prometheus 是什 ...

  10. Linux下高cpu解决方案

    昨天搞定了一个十万火急的issue,客户抱怨产品升级后系统会变慢和CPU使用率相当高,客户脾气很大,声称不尽快解决这个问题就退货,弄得我们 R&D压力很大,解决这个issue的任务分给了我,客 ...