基于傅里叶变换和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 (免费使用,但不开放源码, ...
随机推荐
- Vue + Webpack + Vue-loader 系列教程(1)功能介绍篇
原文地址:https://lvyongbo.gitbooks.io/vue-loader/content/ Vue-loader 是什么? vue-loader 是一个加载器,能把如下格式的 Vue ...
- SQL Server常见数据类型介绍
数据表是由多个列组成,创建表时必须明确每个列的数据类型,以下列举SQL Server常见数据类型的使用规则,方便查阅. 1.整数类型 int 存储范围是-2,147,483,648到2,147,483 ...
- node-sass 安装失败的解决措施
在测试gulp-webapp的时候遇到了styles不能被正常编译的问题,究其原因是node-sass没有被正常安装. 根本原因是国内网络的原因. 最终的解决方法是通过淘宝的npm镜像安装node-s ...
- 代码的坏味道(14)——重复代码(Duplicate Code)
坏味道--重复代码(Duplicate Code) 重复代码堪称为代码坏味道之首.消除重复代码总是有利无害的. 特征 两个代码片段看上去几乎一样. 问题原因 重复代码通常发生在多个程序员同时在同一程序 ...
- JavaScript 写计算器改进版
<html><head><style> .short{height:50px;width:55px;float:left;}</style></h ...
- struts2国际化
struts2国际化 1:什么是国际化? 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有的与语言,国家/地区和文化相关的元素 ...
- 初探java中this的用法
一般this在各类语言中都表示“调用当前函数的对象”,java中也存在这种用法: public class Leaf { int i = 0; Leaf increment(){ i++; retur ...
- 凭吊一下ASP.NET 5,然后跨平台,越跨越开心
ASP.NET 5 is dead ASP.NET 5在今年早些时候被宣判死刑了.但是这并不影响我们之前在ASP.NET 5乃至ASP.NET MVC平台上的经验累积--没错,微软改名部门又立功了!他 ...
- ASP.NET 5 改名 ASP.NET Core 1.0
今天,Scott Hanselman在其博客上宣布<ASP.NET 5 is dead - Introducing ASP.NET Core 1.0 and .NET Core 1.0>, ...
- 集成基于CAS协议的单点登陆
相信大家对单点登陆(SSO,Single Sign On)这个名词并不感到陌生吧?简单地说,单点登陆允许多个应用使用同一个登陆服务.一旦一个用户登陆了一个支持单点登陆的应用,那么在进入其它使用同一单点 ...