![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 产生Sine Sweep波 | |||||
作者:Free 文章来源:本站原创 点击数: 更新时间:2008-2-29 ![]() |
|||||
|
在滤波器设计中,经常需要知道滤波器的频率特性。测量滤波器的脉冲响应,能够精确地获取频率特性。但是如果无法进行精确的数字的脉冲响应运算的话,那么用Sine Sweep波(频率逐渐变高的正弦波,也叫做频率扫描)来测量系统的频率特性是再适合不过的了。例如我们可以用Sine Sweep波来测量某个Mp3播放器的的频率特性,以及设置不同的EQ(均衡器)之后的频率特性。我们可以让播放器播放某个特定的Sine Sweep文件,用录音设备记录下它的输出声音,查看录下来的波形就能大概知道系统的频率特性了。 为了符合人类的听觉特性,通常频率响应图的频率轴都采用对数坐标。因此我们要产生的Sweep波的频率变化就需要成指数增长。下面具体谈谈如何推导出这种 Sine Sweep波的函数方程。Sweep波的频率需要根据时间成指数增长,因此它的函数方程为 freq(f) = f0*k^t
其中f0为初始频率,k为增长系数,例如如果我们要产生f0 - f1的t0秒的Sweep波 的话,那么 k = exp(log(f1/f0)/t0)
我们知道频率为F的正弦波的函数为 sweep(t)=sin(2*PI*F*t)
那么把频率的变化 方程带入此式得 sweep(t)=sin(2*PI*f0*k^t*t)
这个公式是否正确,我写了一个程序测试,程序按照f0=20Hz, f1=20kHz, t0=50s 设置,结果发现37秒左右的时候就已经达到了20kHz的频率了。所以这个公式是错误的。 那么错在什么地方呢?我们从频率的基本概念入手,重新考虑这个问题。所谓频率就是相位的变化率,所以频率是相位的导数,相位是频率的积分。当频率函数为常数F也就是freq(t)=F时,那么相位函数为freq(t)的积分与2PI的乘积,phase(t)=2*PI*F*t,这样恒定频率F的正弦波的方程才是sin(2*PI*F*t)。 如果频率函数为 freq(t) = f0*k^t
则计算相位函数需要对f0*k^t积分,得 phase(t) = 2*PI*f0*(k^t-1)/log(k)
所以正确的Sine sweep波的函数为: sweep(t) = sin(2*PI*f0*(k^t-1)/log(k))
这里给出一个输出Sine Sweep Wave文件的Python程序 。其核心的计算部分为: def sinesweep(f0, f1, sweeptime, samplingrate, peak):
k = exp(log(float(f1)/f0)/sweeptime) data = array.array("h", "\x00"*sweeptime*samplingrate*2) dt = 1.0/samplingrate t = 0.0 p = 2*pi*f0/log(k) for i in xrange(sweeptime*samplingrate): data[i] = int(peak*sin( p*(pow(k,t)-1) )) t += dt return data 第四个参数是输出波形的振幅,最大为0x7fff。由于Python本身不太适合这样的重量级计算,因此程序运行需要一些时间,如果安装了psyco库的话,取消 import psyco
psyco.profile() 两行的注释能够加速程序3倍左右。以后我会详细讲解如何利用这个Sine Sweep测量Mp3播放器的频率响应。 |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 没有相关文章 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|