基于傅里叶变换和PyQt4开发一个简单的频率计数器
小学期的《信号与系统》课,要求写一个频率计数器,下面是我个人理解的频率计数
傅里叶变换的代码:
# 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开发一个简单的频率计数器的更多相关文章
- 基于ACE的TAO开发---一个简单的入门实例-----VS2008(二)
上一节已经说了如何编译idl文件.现在就用编好的文件来写一个最小的corba小程序的.程序分为服务器程序和客户端程序. 说明下,代码是<基于C++CORBA高级编程>一书中的例子. 1.首 ...
- 基于ACE的TAO开发---一个简单的入门实例-----VS2008(一)
万事开头难,不管做什么事最开始总是最困难的,一旦上手了就好了. 这也是我自己学习corba编程的一点经验和心得.下面的例子主要是保证读者跟着走能立马看到效果. 1.机器上的TAO是实现已经装好的开发版 ...
- 如何开发一个简单的HTML5 Canvas 小游戏
原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...
- 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务
[源码下载] 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后 ...
- Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状)
Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状) 本篇博客来给大家介绍怎样使用Lua这门语言来开发一个简单的小游戏-记数字踩白块. 游戏的流程是这种:在界面上生成5个数1~5字并显 ...
- Python开发一个简单的BBS论坛
项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...
- 作业1开发一个简单的python计算器
开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...
- django学习-11.开发一个简单的醉得意菜单和人均支付金额查询页面
1.前言 刚好最近跟技术部门的[产品人员+UI人员+测试人员],组成了一桌可以去公司楼下醉得意餐厅吃饭的小team. 所以为了实现这些主要点餐功能: 提高每天中午点餐效率,把点餐时间由20分钟优化为1 ...
- 基于SOUI开发一个简单的小工具
基于DriectUI有很多库,比如 Duilib (免费) soui (免费) DuiVision (免费) 炫彩 (界面库免费,UI设计器付费,不提供源码) skinui (免费使用,但不开放源码, ...
随机推荐
- 操作系统篇-hello world(免系统运行程序)
|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 今天起开始分享关于操作系统的相关知识,本人也是菜鸟一个,正处于学习阶段,这整个操作系统篇也是我边学习边总结的一些结果,希 ...
- OpenCV人脸识别Eigen算法源码分析
1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...
- 几个有趣的WEB设备API 前端提高B格必备(一)——电池状态&震动api
受到同事启发,突然发现了几个有趣又实用的web api,没想到前端还有这么多有趣的东西可以玩~~简直过分. 1.电池状态API navigator.getBattery():这个api返回的是一个pr ...
- Postman接口调试神器-Chrome浏览器插件
首先大家可以去这个地址下载 Postman_v4.1.3 这个版本,我用的就是这个版本 http://chromecj.com/web-development/2014-09/60/download. ...
- 应该是Angular2的一个bug?
为了应对未来的趋势,及时赶上下一趟互联网技术,我最近也在通过具体项目研究angular2,首先必须要吐槽的是,学习angular2的成本本身不高,但是一堆的工具.配置实在让人 很是焦灼,就像asp.n ...
- Loadrunner Http Json接口压力测试
前天接到了一个测试任务,要求测试一下ES(elsticsearch)在不同并发下的查询效率.如图: 业务场景是在客户端根据具体车牌查询相关车辆信息,结果返回前10条记录. 从图中可以看到,接口的请求参 ...
- iOS 多线程之GCD的使用
在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...
- Linux基础介绍【第六篇】
定时任务crond介绍 crond是什么? crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件.一般情况下,安装完CentOS5/6 linux操作系统之后,默认便会启动cro ...
- 如何查看w3p.exe 和IIS 应用程序池的关系
图形界面方式 命令行方式 如果找不到 appcmd Appcmd.exe exists at the location %systemroot%\system32\inetsrv\. You eith ...
- 希尔排序(java)
时间复杂度为O( n^(3/2) )不是一个稳定的排序算法 如何看一个算法是否稳定:{("scala",12),("python",34),("c++ ...