网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> C6000文章 >> C67X系列 >> 文章正文
  产生Sine Sweep波           ★★★ 【字体:
产生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波 的话,那么

= 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条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号