讨论产生线性频率变化的公式和它的离散公式之间的差异,并提出Chirp信号的修改方案。

Chirp信号的公式

对于固定频率f1f_1f1​的信号,它的表达式为:r(t)=cos⁡(2π⋅f1⋅t)r\left( t \right) = \cos \left( {2\pi \cdot f_1 \cdot t} \right)r(t)=cos(2π⋅f1​⋅t)

其中正弦信号中的相位是频率对时间的积分:θ(t)=2π⋅∫0tf1⋅dτ=2π⋅f1⋅t\theta \left( t \right) = 2\pi \cdot \int_0^t {f_1 \cdot d\tau } = 2\pi \cdot f_1 \cdot tθ(t)=2π⋅∫0t​f1​⋅dτ=2π⋅f1​⋅t

Chirp信号的频率是变化的,一种最简单的变化就是线性变化,从开始t=t0t = t_0t=t0​的频率fstartf_{start}fstart​,一直线性变化到t=t1t = t_1t=t1​时的频率fendf_{end}fend​。那么任何时刻的频率值为:f(t)=fend−fstartt1−t0⋅t+fstartf\left( t \right) = {{f_{end} - f_{start} } \over {t_1 - t_0 }} \cdot t + f_{start}f(t)=t1​−t0​fend​−fstart​​⋅t+fstart​

对应的正弦信号相角为:θ(t)=2π⋅∫t0t1f(τ)dτ=2π∫t0t1fend−fstartt1−t0⋅τ+fstartdτ\theta \left( t \right) = 2\pi \cdot \int_{t_0 }^{t_1 } {f\left( \tau \right)d\tau } = 2\pi \int_{t_0 }^{t_1 } {{{f_{end} - f_{start} } \over {t_1 - t_0 }} \cdot \tau + f_{start} d\tau }θ(t)=2π⋅∫t0​t1​​f(τ)dτ=2π∫t0​t1​​t1​−t0​fend​−fstart​​⋅τ+fstart​dτ=2π[fend−fstartt1−t0⋅12(t2−t02)+fstart(t−t0)]= 2\pi \left[ {{{f_{end} - f_{start} } \over {t_1 - t_0 }} \cdot {1 \over 2}\left( {t_{}^2 - t_0^2 } \right) + f_{start} \left( {t_{} - t_0 } \right)} \right]=2π[t1​−t0​fend​−fstart​​⋅21​(t2​−t02​)+fstart​(t​−t0​)]

如果假设t0=0t_0 = 0t0​=0,那么上面的公式就是:θ(t)=2π[fend−fstartt1⋅12t2+fstart⋅t]\theta \left( t \right) = 2\pi \left[ {{{f_{end} - f_{start} } \over {t_1 }} \cdot {1 \over 2}t^2 + f_{start} \cdot t} \right]θ(t)=2π[t1​fend​−fstart​​⋅21​t2+fstart​⋅t]

所以,Chirp信号的公式为:
r(t)=cos⁡[2π⋅(fend−fstartt1⋅12t2+fstart⋅t)]r\left( t \right) = \cos \left[ {2\pi \cdot \left( {{{f_{end} - f_{start} } \over {t_1 }} \cdot {1 \over 2}t^2 + f_{start} \cdot t} \right)} \right]r(t)=cos[2π⋅(t1​fend​−fstart​​⋅21​t2+fstart​⋅t)]

下面是在智能车比赛中相应的参数:

起始时间:t0=0st_0 = 0st0​=0s
结束时间:t1=0.2048st_1 = 0.2048st1​=0.2048s
起始频率: fstart=250Hzf_{start} = 250Hzfstart​=250Hz
结束频率:fend=2000Hzf_{end} = 2000Hzfend​=2000Hz

利用时间间隔ts=1/fs=100μst_s = 1/f_s = 100\mu sts​=1/fs​=100μs对该信号进行离散化,得到的波形为:

▲ 通过上述公式产生的Chirp信号波形

def chirpf(t):return cos(2*pi*((fend-fstart)/t1*0.5*t*t+fstart*t))

使用MATLAB产生的Chirp信号波形:

▲ 由MATLAB产出的Chirp信号

tend=0.2048
fs = 1e4
fstart=250
fend=2000
tdim = 0:1/fs:(tend-1/fs)
chirpdim=chirp(tdim,fstart,tend,fend)

▲ 由SCIPY产出的Chirp信号

import scipy.signal
data = scipy.signal.chirp(tdim, fstart,t1, fend)

通过数值对比,可以看到上面三种方式得到的Chirp信号的误差为0。下图显示了公式所计算得到的Chirp信号与MATLAB所产生的Chirp信号的差值。其中微小的误差可能来源于MATLAB结果经过clipboard剪切板之后,数值显示精度降低所引起的。

另外一部分则可能是对于数据的的最后一点的频率微小差异的定义。

▲ 由公式得到的Chirp信号与MATLAB的结果差别

Chirp信号离散生成算法

下面是智能车竞赛信号板单片机通过DAC输出Chirp信号对输出信号buffer进行初始化的程序。

//------------------------------------------------------------------------------
void InitDACBuffer(float fStartF, float fEndF) {float fAngle = 0;float fFrequency;float fDeltaT = 1.0 / DAC_OUTPUT_FREQUENCY;int i;for(i = 0; i < DAC_BUFFER; i ++) {        g_nDACBuffer[i] = (unsigned short)((sin(fAngle * 2 * 3.1415926) + 1.0) / 2 * 0x4ff)+0x100;fFrequency = (fEndF - fStartF) * (i + 1) / DAC_BUFFER + fStartF;fAngle += fFrequency * fDeltaT;}
}

在程序初始化期间调用如下命令:

    InitDACBuffer(250, 2000);

根据上面产生的程序,下面绘制出对应的波形:

▲ 通过离散迭代产生的Chirp信号

DAC_BUFFER = 2048
dacbuf = []
angle = 0
deltat = 1/1e4for i in range(0, DAC_BUFFER):data = cos(angle*2*pi)dacbuf.append(data)frequency = (fend - fstart) * (i + 1) / DAC_BUFFER + fstartangle = angle + frequency * deltatplt.plot(tdim, dacbuf)
plt.xlabel('Time(s)')
plt.ylabel('Amplitude')
plt.grid(True)
plt.show()

对比由离散程序所产生的数据与前面通过公式计算出的波形,可以看到它们之间存在着差异。下面将公式所计算出的数值与前面程序所产生信号相加,所得到的误差信号:

▲ 公式产生的Chirp信号与程序产生的信号之间的误差

使用程序产生Chirp信号的时候,信号的相位是通过离散积分而得到的,其中所出现的积分误差随着时间增加而叠加,最终使得所产生的信号的相位与实际的相位越来越大,信号的差别,也就增加了。

修改方案

将最终信号Chirp生成的公式修改为:

tn=n⋅ts=nfs=n⋅10−4t_n = n \cdot t_s = {n \over {f_s }} = n \cdot 10^{ - 4}tn​=n⋅ts​=fs​n​=n⋅10−4
x[n]=sin⁡[2π⋅(fend−fstartt1⋅12tn2+fstart⋅tn)]x\left[ n \right] = \sin \left[ {2\pi \cdot \left( {{{f_{end} - f_{start} } \over {t_1 }} \cdot {1 \over 2}t_n^2 + f_{start} \cdot t_n } \right)} \right]x[n]=sin[2π⋅(t1​fend​−fstart​​⋅21​tn2​+fstart​⋅tn​)]

使用sin信号的目的,就是防止最初的信号开始的跳变。根据上面公式所产生的波形为:

▲ 最终定义的Chirp信号的波形

生成12bit DAC转换对应的数据:

for i in range(DAC_BUFFER):tn = i / fsangle = (fend-fstart)/t1 * tn * tn / 2 + fstart * tndatasin = sin(2*pi*angle)dataint16 = int((datasin + 1.0) / 2 * 0x4ff + 0x100)dacbuf.append(dataint16)

信号波形为:

▲ 12bit对应的信号波形

▲ 生成8bit DAC对应的波形

▲ 生成7bit DAC对应的波形

▲ 生成6bit DAC对应的波形

生成相关的整型信号,便于MCU输出模拟信号:

#------------------------------------------------------------
fstart = 250
fend = 2000
t0 = 0
t1 = 0.2048
ts = 100e-6tdim = linspace(t0, t1, int((t1-t0)/ts), endpoint=False)#------------------------------------------------------------
DAC_BUFFER = 2048
dacbuf = []
fs = 1e4for i in range(DAC_BUFFER):tn = i / fsangle = (fend-fstart)/t1 * tn * tn / 2 + fstart * tndatasin = sin(2*pi*angle)dataint16 = int((datasin + 1.0) / 2 * 0x3f)dacbuf.append(dataint16)tspsave('chirp6bit', dacbuf=dacbuf)

下面是将NPZ数据转换成C51的变量的程序。

dacbuf0 = tspload('chirp8bit', 'dacbuf')
dacbuf1 = tspload('chirp7bit', 'dacbuf')
dacbuf2 = tspload('chirp6bit', 'dacbuf')pastestr = 'unsigned char const code g_ucChirpData[] = {\r\n'
linenumber = 16
lines = int(len(dacbuf2) / linenumber)for i in range(lines):linedata = 127 - dacbuf2[i * linenumber : (i + 1) * linenumber]datastr = str(linedata).strip('[]').split(' ')datastr1 = [s for s in datastr if len(s) > 0]linestr = ','.join(datastr1).lstrip(',') + ',\r\n'pastestr = pastestr + '    ' + linestrpastestr = pastestr + '};\r\n'clipboard.copy(pastestr)
printf(pastestr)

Chirp信号公式与对离散生成算法之间的差异相关推荐

  1. 声音信标发出白噪声和发出chirp信号的对比测距说明

    在 十五届全国大学生智能汽车竞赛 中安排后一个 声音信标导航 竞赛组别.参赛同学反馈,声音信标发送的 Chirp信号 在远处听起来会令人产生一种恐慌紧张的感觉,极大扰民. 如果将信标的声音改成同样宽带 ...

  2. C4.5决策树生成算法完整版(Python),连续属性的离散化, 缺失样本的添加权重处理, 算法缺陷的修正, 代码等

    C4.5决策树生成算法完整版(Python) 转载请注明出处:©️ Sylvan Ding ID3算法实验 决策树从一组无次序.无规则的事例中推理出决策树表示的分类规则,采用自顶向下的递归方式,在决策 ...

  3. 鲁棒优化入门(4)-两阶段鲁棒优化及行列生成算法(CCG)超详细讲解(附matlab代码)

    本文的主要参考文献: Zeng B , Zhao L . Solving Two-stage Robust Optimization Problems by A Constraint-and-Colu ...

  4. 从DDPM到GLIDE:基于扩散模型的图像生成算法进展

    前几天,OpenAI在Arxiv上挂出来了他们最新最强的文本-图像生成GLIDE [1],如头图所示,GLIDE能生成非常真实的结果.GLIDE并非基于对抗生成网络或是VQ-VAE类模型所设计,而是采 ...

  5. 全排列的生成算法:字典序法

    全排列的生成算法:字典序法    全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.     字典序法按照字典序求下一个排列的算法 生成给定全排列的下一个排列所 ...

  6. 曲线的生成算法实现_PCGPlanet1-地形生成算法简介

    比较常用的地形生成算法有三种: 四叉树算法,GeoMipmap算法,移动立方体算法 目前市面游戏采用的方案基本都是以这三种算法为基础实现的,下面依次进行介绍 四叉树算法 很经典的算法,在没有GPU的时 ...

  7. python雪花算法生成id_理解分布式id生成算法SnowFlake

    分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种. 概述 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1位,不用.二进制中最高位 ...

  8. line划线计算机图像学,【计算机图形学】根本图形元素:直线的生成算法

    [计算机图形学]基本图形元素:直线的生成算法 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net ...

  9. 从一维cutting问题看列生成算法

    从一维cutting问题看列生成算法 列生成算法 一维cutting问题 列生成原理 集合覆盖模型 列生成步骤说明 python 代码实现 列生成算法 列生成在求解大型线性规划时往往都表现良好,在很多 ...

最新文章

  1. 分布式对象存储系统在openstack中的应用研究--Ceph(一)
  2. java joda_java-Jodatime的开始时间和结束时间
  3. layui表单验证 内置自定义规则 - 使用说明
  4. c语言 poll,c语言 linux 中 poll 的参数
  5. RN style使用以及常用样式总结
  6. jQuery 查找元素节点
  7. destoon 支付异步接口文件 notify.php 调试方式
  8. linux安装中文输入法
  9. [转载]《Linux Kernel Development》读书笔记 - 蔚蓝海岸 - C++博客
  10. VS2022 安装 .NET Framework 4.0的方法
  11. 5分钟快速学会使用Swiper.js,实现轮播图各种效果!
  12. 参考线--深入了解字体
  13. 项目2-企业级电商平台的搭建--填坑过程
  14. 对element多级联动键盘移动会被隐藏bug解决-感觉不太好但也实现了-看有没有爸爸优化下
  15. 南山- 旅游景点 - 小宝的家 - 和讯博客
  16. 计算机视觉在AI中的7种应用
  17. webgl - 实现景深效果(一)
  18. android工程文件assts,Android初始化FaceSDK报错
  19. 精心挑选10款基于 jQuery 的图片360度旋转插件
  20. autoit学习笔记---“While…WEnd”循环

热门文章

  1. PostgreSQL on XFS 性能优化 - 1
  2. Java多线程面试题
  3. python的list去除重复
  4. 音视频互动开发平台之AnyChat SDK
  5. 【转】mysql多台服务器数据同步
  6. 浅谈Android组件化
  7. MSDN-9月杂志推荐
  8. UWP开发入门(十九)——10分钟学会在VS2015中使用Git
  9. 技术方案——可控组播
  10. CS-APP:Section 5.1,Memory aliasing :看上去逻辑一样,执行结果一样吗?