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

article/2025/10/4 0:16:41

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

Chirp信号的公式

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

其中正弦信号中的相位是频率对时间的积分: θ ( t ) = 2 π ⋅ ∫ 0 t f 1 ⋅ d τ = 2 π ⋅ f 1 ⋅ 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π0tf1dτ=2πf1t

Chirp信号的频率是变化的,一种最简单的变化就是线性变化,从开始 t = t 0 t = t_0 t=t0的频率 f s t a r t f_{start} fstart,一直线性变化到 t = t 1 t = t_1 t=t1时的频率 f e n d f_{end} fend。那么任何时刻的频率值为: f ( t ) = f e n d − f s t a r t t 1 − t 0 ⋅ t + f s t a r t f\left( t \right) = {{f_{end} - f_{start} } \over {t_1 - t_0 }} \cdot t + f_{start} f(t)=t1t0fendfstartt+fstart

对应的正弦信号相角为: θ ( t ) = 2 π ⋅ ∫ t 0 t 1 f ( τ ) d τ = 2 π ∫ t 0 t 1 f e n d − f s t a r t t 1 − t 0 ⋅ τ + f s t a r t d τ \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πt0t1f(τ)dτ=2πt0t1t1t0fendfstartτ+fstartdτ = 2 π [ f e n d − f s t a r t t 1 − t 0 ⋅ 1 2 ( t 2 − t 0 2 ) + f s t a r t ( t − t 0 ) ] = 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π[t1t0fendfstart21(t2t02)+fstart(tt0)]

如果假设 t 0 = 0 t_0 = 0 t0=0,那么上面的公式就是: θ ( t ) = 2 π [ f e n d − f s t a r t t 1 ⋅ 1 2 t 2 + f s t a r t ⋅ 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π[t1fendfstart21t2+fstartt]

所以,Chirp信号的公式为:
r ( t ) = cos ⁡ [ 2 π ⋅ ( f e n d − f s t a r t t 1 ⋅ 1 2 t 2 + f s t a r t ⋅ 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π(t1fendfstart21t2+fstartt)]

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

起始时间: t 0 = 0 s t_0 = 0s t0=0s
结束时间: t 1 = 0.2048 s t_1 = 0.2048s t1=0.2048s
起始频率: f s t a r t = 250 H z f_{start} = 250Hz fstart=250Hz
结束频率: f e n d = 2000 H z f_{end} = 2000Hz fend=2000Hz

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

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

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

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

使用MATLAB产生的Chirp信号波形:
▲ 由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信号

▲ 由SCIPY产出的Chirp信号

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

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

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

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

▲ 由公式得到的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信号

▲ 通过离散迭代产生的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信号的时候,信号的相位是通过离散积分而得到的,其中所出现的积分误差随着时间增加而叠加,最终使得所产生的信号的相位与实际的相位越来越大,信号的差别,也就增加了。

 

修改方案

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

t n = n ⋅ t s = n f s = n ⋅ 1 0 − 4 t_n = n \cdot t_s = {n \over {f_s }} = n \cdot 10^{ - 4} tn=nts=fsn=n104
x [ n ] = sin ⁡ [ 2 π ⋅ ( f e n d − f s t a r t t 1 ⋅ 1 2 t n 2 + f s t a r t ⋅ t n ) ] 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π(t1fendfstart21tn2+fstarttn)]

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

▲ 最终定义的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对应的信号波形

▲ 12bit对应的信号波形

▲ 生成8bit DAC对应的波形

▲ 生成8bit DAC对应的波形

▲ 生成7bit DAC对应的波形

▲ 生成7bit DAC对应的波形

▲ 生成6bit 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)

http://chatgpt.dhexx.cn/article/PBhgfXMT.shtml

相关文章

matlab啁啾信号,啁啾信号chirp(扫频余弦信号)

Chirp信号 Generate swept-frequency cosine (chirp) signal Chirp信号是一个典型的非平稳信号,在通信、声纳、雷达等领域具有广泛的应用, Chirp译名:啁啾(读音:“周纠”),是通信技术有关编码脉冲技术中的一种术语,是指对脉冲进行编码时,其载频在脉冲持续时间内线性地增加…

77GHz毫米波雷达快速chirp信号技术(一):测距原理

快速chirp信号指的是发射天线发射如下图所示信号: 单个chirp的解析式为 x ( t ) = s i n ( 2 ∗ p i ∗ ( f 0 + 0.5 ∗ S ∗ t ) . ∗ t ) x(t)=sin(2*pi*(f_0+0.5*S*t).*t) x(t)=sin(2∗pi∗(f0​+0.5∗S∗t).∗t)。 其中斜率 S S S达到 M H z / u s MHz/us MHz/us的数量级…

语音信号预处理3——计算原始chirp信号与滤波后chirp信号的相关性

写在前面&#xff1a;仅作为个人学习笔记&#xff0c;便于以后查阅&#xff0c;如对你有帮助&#xff0c;荣幸之至&#xff0c;如有错误&#xff0c;欢迎评论指正 编程软件&#xff1a;matlab R2018b 系统&#xff1a; win10 系列文章目录 chirp信号的生成与接收对接收到的c…

MATLAB学习笔记之chirp信号的产生

chirp信号即线性调频信号&#xff0c;是指瞬时频率随时间呈线性变化的信号。 chirp信号的matlab程序实现方法如下&#xff1a; 1.可利用matlab自带的chirp函数生成。 chirp&#xff08;t&#xff0c;f0&#xff0c;T&#xff0c;f1&#xff09;&#xff1b; T表示脉冲宽度&…

chirp信号频谱(三角波和锯齿波)

普通chirp信号 ​​​​​​​ 频谱 图中信号载波3.2GHz&#xff0c;采样率256MHz&#xff0c;带宽100MHz&#xff0c;脉宽64us %% --------仿真数据--------------- fs256e6; Nr16384; ts 1/fs; fc3.2e9; B10…

USB chirp信号测试

1 信号及原理分析 1.1 KJ信号说明 USBchirp信号分为K信号和J信号。根据USB速率将chirp信号做如下区别&#xff1a; USB速率 Chirp DP DM 空闲状态 Low Speed K 1 0 K J 0 1 Full Speed K 0 1 J J 1 0 High Speed K 0 1 SE0 J 1 0 SE0 0 0 1…

chirp信号相关

1、frft 基于分数阶傅里叶变换的chirp信号检测与参数估计&#xff08;原理附代码&#xff09;_非 常 道的博客-CSDN博客_chirp基 求相关性最好的阶数&#xff1a; 其中fs是采样频率&#xff0c;arccot这个在matlab中有相应的函数&#xff0c;B是chirp信号的带宽。 2、在实际工作…

基于分数阶傅里叶变换的chirp信号检测与参数估计(原理附代码)

线性调频信号&#xff08;chirp信号&#xff09; 顾名思义&#xff0c;该信号的频率随着时间线性变换&#xff0c;其复数表达形式如下&#xff1a; s ( t ) e 2 j π ( f 0 t 0.5 μ t 2 ) s(t)e^{2j\pi(f_0 t 0.5\mu t^2)} s(t)e2jπ(f0​t0.5μt2) 根据欧拉公式&#xff…

Chirp信号及其生成

Chirp信号是一个典型的非平稳信号&#xff0c;在通信、声纳、雷达等领域具有广泛的应用。 简介 Chirp译名:啁啾&#xff08;读音&#xff1a;“周纠”&#xff09;&#xff0c;是通信技术有关编码脉冲技术中的一种术语&#xff0c;是指对脉冲进行编码时&#xff0c;其载频在脉冲…

什么是chirp信号

什么是chirp信号&#xff1f;&#xff08;翻译自维基百科&#xff09; 维基百科是这样说的&#xff1a; A chirp is a signal in which the frequency increases (up-chirp) or decreases (down-chirp) with time。 也就是说&#xff1a;是频率随着时间增加或减小的信号。 …

Chirp信号简单介绍

1.定义&#xff1a;chirp指的是频率随时间增加或减少的信号。它通常应用于声纳、雷达和激光系统&#xff0c;以及其他应用&#xff0c;如扩频通信。&#xff08;大多数情况也可称为线性chirp信号&#xff0c;但其实chirp信号未必是线性的&#xff09; 2.公式推导理解&#xff…

Chirp信号基础知识及matlab实现

Chirp信号的表达式如下&#xff1a; x ( t ) e x p ( j 2 π ( f 0 t 1 2 k t 2 ) ) x(t)exp(j2\pi (f_0t\frac{1}{2} kt^2)) x(t)exp(j2π(f0​t21​kt2)) 其中&#xff0c; f 0 f_0 f0​ 称作起始频率,k为调频率 对相位进行求导&#xff0c;得到角频率以及频率随时间的线…

项目通信之RPC调用——java简单实现

微服务项目通信方法很多&#xff0c;有像springcloud解决方案的http通信&#xff0c;还有像阿里Dubbo的RPC通信&#xff0c;这里简单实现RPC调用。一共2个端&#xff0c;客户端server和客户端client.项目demo很简单&#xff0c;就不多讲了&#xff0c;看代码好了。 下面是服务…

RabbitMQ消息队列之RPC调用

我们知道现在市面上的RPC框架很多&#xff0c;但是如何用我们的RabbitMQ去实现一个RPC调用呢&#xff1f;这就是我们这篇文章所要讲解的内容。 如果有阅读过我写的博客的大兄弟们&#xff0c;可能会知道&#xff0c;我有个习惯就是学习技术喜欢去看官方文档&#xff0c;同样对于…

rpc调用过程原理分析以及Dubbo、Feign调用过程

RPC简介 RPC是远程过程调用&#xff08;Remote Procedure Call&#xff09;的缩写形式。 RPC调用流程图 客户端方法&#xff1a;服务调用方所调用的接口 客户端代理&#xff1a;将接口封装成代理对象&#xff0c;并序列化请求参数、反序列化响应结果&#xff0c;使用远程传输…

SpringBoot+RabbitMQ 实现 RPC 调用

说到 RPC&#xff08;Remote Procedure Call Protocol 远程过程调用协议&#xff09;&#xff0c;小伙伴们脑海里蹦出的估计都是 RESTful API、Dubbo、WebService、Java RMI、CORBA 等。 其实&#xff0c;RabbitMQ 也给我们提供了 RPC 功能&#xff0c;并且使用起来很简单。 …

消息中间件RabbitMQ(五)——实现RPC调用

文章目录 1. RPC2. 实现原理3. 代码实现3.1 客户端实现3.2 服务端实现3.3 测试 4. 小结 1. RPC 对于微服务开发者&#xff0c;对于 RPC&#xff08;Remote Procedure Call Protocol 远程过程调用协议&#xff09;并不会陌生吧&#xff0c; RESTful API、Dubbo、WebService等都…

springcloud 远程rpc调用接口

springcloud 如果想要从注册中心中调用已经注册的接口&#xff0c;需要用如下方法。 我们现在已经将一个微服务注册到了注册中心。端口是8083的那个 并且里面有个member的RequestMapping 首先&#xff0c;创建一个微服务&#xff0c;将需要的依赖放入pom.xml和配置好apppli…

浅谈RPC调用过程

RPC(Remote Procedure Call) - 远程过程调用&#xff0c;是一个计算机通信协议&#xff0c;它允许运行于一台计算机的程序调用另一台计算机的子程序&#xff0c;而无需额外地为这个交互作用编程。RPC主要应用在分布式系统架构中不同的系统之间的远程通信和相互调用。 举个例子…

远程RPC调用用于js逆向

这里只是记录于学习&#xff0c;资源来自于大佬的github&#xff0c;有十分详细的介绍&#xff0c;我仅仅拿来一用。https://github.com/jxhczhl/JsRpc。&#xff08;注RPC在某些网站会被检测到&#xff09; 在右侧下载适合自己系统的exe文件&#xff0c;双击打开 练习对象是某…