基于傅里叶变换和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 (免费使用,但不开放源码, ...
随机推荐
- 用scikit-learn学习BIRCH聚类
在BIRCH聚类算法原理中,我们对BIRCH聚类算法的原理做了总结,本文就对scikit-learn中BIRCH算法的使用做一个总结. 1. scikit-learn之BIRCH类 在scikit-l ...
- H5坦克大战之【画出坦克】
今天是个特殊的日子,圣诞节,也是周末,在这里先祝大家圣诞快乐!喜庆的日子,我们可以稍微放松一下,扯一扯昨天雷霆对战凯尔特人的比赛,这场比赛大威少又双叒叕拿下三双,而且是一个45+11+11的超级三双, ...
- Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩
目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...
- BPM配置故事之案例13-触发消息通知
老李:小明! 小明:--见你就没好事,又要我干嘛? 老李:额,小事小事,最近很多部门都觉得Boss的审批速度太慢了,能不能以后给审批人一个消息提醒? 小明:--有一种不太好的预感 老李:怎么,很困难么 ...
- Android中访问sdcard路径的几种方式
以前的Android(4.1之前的版本)中,SDcard路径通过"/sdcard"或者"/mnt/sdcard"来表示,而在JellyBean(安卓4.1)系统 ...
- BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
4453: cys就是要拿英魂! Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 90 Solved: 46[Submit][Status][Discu ...
- MongoDB数据实体中的ObjectId序列化成json的一个小坑
很多时候我们都需要对实体对象进行序列化与反序列化,而ObjectId类型,只能用mongo的驱动以bson格式来序列化,但我们对外的交互,一般是json格式. 有两种解决方案: 1.自己写一个json ...
- CSharpGL(9)解析OBJ文件并用CSharpGL渲染
CSharpGL(9)解析OBJ文件并用CSharpGL渲染 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...
- Entity Framework 6 Recipes 2nd Edition(9-4)译->Web API 的客户端实现修改跟踪
9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Cod ...
- Android开发学习之路-动态高斯模糊怎么做
什么是高斯模糊? 高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪 ...