Chirp-Z变换(线性调频Z变换)原理

news2025/2/27 7:20:13

Chirp-Z变换(Chirp-Z Transform,CZT)

采用FFT算法可以很快地计算出全部DFT值,即Z变换在单位圆上的全部等间隔采样值。
在实际情况中,并不需要对整个单位圆的频谱进行分析,例如,对于窄带信号,往往只需要对信号所在的一段频带进行分析,即可在所关心的这段频带内进行密集的采样,而对这个频带以外的部分可以完全不管。
Z变换的螺旋采样,它沿Z平面上的一段螺线进行等分角的采样,这些采样点可以表示为
z k = A W − k ,    k = 0 , 1 , ⋯   , M − 1 z_k=AW^{-k},\ \ k=0,1,\cdots,M-1 zk=AWk,  k=0,1,,M1
其中, M M M为采样点的总数, A A A为起始点位置,可以用半径 A 0 A_0 A0及相角 θ 0 \theta_0 θ0表示为 A = A 0 e j θ 0 A=A_0 e^{j\theta_0} A=A0ejθ0
参数 W W W表示为 W = W 0 e − j ϕ 0 W=W_0e^{-j\phi_0} W=W0ejϕ0 W 0 W_0 W0为螺线的伸展率, W 0 > 1 W_0>1 W0>1,螺线内缩, W 0 < 1 W_0<1 W0<1,螺线外伸;
ϕ 0 \phi_0 ϕ0为螺线上采样点之间的等分角。
在这里插入图片描述

M = N M=N M=N A = 1 A=1 A=1 W = e − j 2 π N W=e^{-j\frac{2\pi}{N}} W=ejN2π时, z k z_k zk就等间隔地分布在单位圆上,这时CZT退化DFT。
假设 x ( n ) x(n) x(n)是长度为 N N N的有限长序列,则其Z变换在采样点 z k z_k zk上的值 X ( z k ) = ∑ n = 0 N − 1 x ( n ) z k − n ,    k = 0 , 1 , 1 , ⋯   , M − 1 X(z_k)=\sum_{n=0}^{N-1}x(n)z_k^{-n}, \ \ k=0,1,1,\cdots,M-1 X(zk)=n=0N1x(n)zkn,  k=0,1,1,,M1
为减少计算量,将上式运算转换为卷积形式,从而采用FFT进行计算。

算法原理

z k = A W − k z_k=AW^{-k} zk=AWk代入 X ( z k ) = ∑ n = 0 N − 1 x ( n ) z k − n X(z_k)=\sum_{n=0}^{N-1}x(n)z_k^{-n} X(zk)=n=0N1x(n)zkn可得
X ( z k ) = ∑ n = 0 N − 1 x ( n ) A − n W n k X(z_k)=\sum_{n=0}^{N-1}x(n)A^{-n}W^{nk} X(zk)=n=0N1x(n)AnWnk
n k nk nk替换为 1 2 [ k 2 + n 2 − ( k − n ) 2 ] \frac{1}{2}[k^2+n^2-(k-n)^2] 21[k2+n2(kn)2],则
X ( z k ) = ∑ n = 0 N − 1 x ( n ) A − n W 1 2 [ k 2 + n 2 − ( k − n ) 2 ] = W k 2 2 ∑ n = 0 N − 1 x ( n ) A − n W n 2 2 W − ( k − n ) 2 2 X(z_k)=\sum_{n=0}^{N-1}x(n)A^{-n}W^{\frac{1}{2}[k^2+n^2-(k-n)^2]}=W^\frac{k^2}{2}\sum_{n=0}^{N-1}x(n)A^{-n}W^{\frac{n^2}{2}}W^{-\frac{(k-n)^2}{2}} X(zk)=n=0N1x(n)AnW21[k2+n2(kn)2]=W2k2n=0N1x(n)AnW2n2W2(kn)2
定义 g ( n ) = x ( n ) A − n W n 2 2 ,    n = 0 , 1 , 2 , ⋯   , N − 1 g(n)=x(n)A^{-n}W^{\frac{n^2}{2}},\ \ n=0,1,2,\cdots,N-1 g(n)=x(n)AnW2n2,  n=0,1,2,,N1 h ( n ) = W − n 2 2 h(n)=W^{\frac{-n^2}{2}} h(n)=W2n2,则有
g ( k ) ∗ h ( k ) = ∑ n = 0 N − 1 g ( n ) h ( k − n ) = ∑ n = 0 N − 1 x ( n ) A − n W n 2 2 W − ( k − n ) 2 2 ,    k = 0 , 1 , ⋯   , M − 1 g(k)\ast h(k)=\sum_{n=0}^{N-1}g(n)h(k-n)=\sum_{n=0}^{N-1}x(n)A^{-n}W^{\frac{n^2}{2}}W^{-\frac{(k-n)^2}{2}},\ \ k=0,1,\cdots,M-1 g(k)h(k)=n=0N1g(n)h(kn)=n=0N1x(n)AnW2n2W2(kn)2,  k=0,1,,M1
则有
X ( z k ) = [ g ( k ) ∗ h ( k ) ] W k 2 2 ,    k = 0 , 1 , ⋯   , M − 1 X(z_k)=[g(k)\ast h(k)]W^{k^2}{2},\ \ k=0,1,\cdots,M-1 X(zk)=[g(k)h(k)]Wk22,  k=0,1,,M1
算法流程图如下:
在这里插入图片描述

实现步骤

  1. 选择一个最小整数 L L L,使其满足 L ≥ N + M − 1 L\ge N+M-1 LN+M1,同时 L = 2 m L=2^m L=2m
  2. h ( n ) h(n) h(n)的主值序列 h ^ ( n ) \hat h(n) h^(n),并计算DFT;
    h ^ ( n ) = { W − n 2 2 0 ≤ n ≤ M − 1 任意值 N ≤ n ≤ L − 1 W − ( n − L ) 2 2 L − N + 1 ≤ n ≤ L − 1 \hat h(n)=\left\{\begin{array}{ll} W^{-\frac{n^2}{2}} & 0\le n \le M-1 \\ \text{任意值} & N \le n \le L-1 \\ W^{-\frac{(n-L)^2}{2}} & L-N+1\le n \le L-1 \end{array}\right. h^(n)= W2n2任意值W2(nL)20nM1NnL1LN+1nL1
    H ( k ) = D F T [ h ^ ( n ) ] ,    L 点 H(k)=DFT[\hat h(n)],\ \ L点 H(k)=DFT[h^(n)],  L
  3. x ( n ) x(n) x(n)加权、补零,并计算DFT;
    g ( n ) = { x ( n ) A − n W n 2 2 0 ≤ n ≤ N − 1 0 N ≤ n   L − 1 g(n)=\left\{\begin{array}{ll} x(n)A^{-n}W^{\frac{n^2}{2}} & 0\le n \le N-1 \\ 0 & N \le n \ L-1 \end{array}\right. g(n)={x(n)AnW2n200nN1Nn L1
    G ( k ) = D F T [ g ( n ) ] ,    L 点 G(k)=DFT[g(n)],\ \ L点 G(k)=DFT[g(n)],  L
  4. Y ( k ) = G ( k ) H ( k ) ,    L 点 Y(k)=G(k)H(k),\ \ L点 Y(k)=G(k)H(k),  L
  5. y ( n ) = I D F T [ Y ( k ) ] ,    L 点 y(n)=IDFT[Y(k)],\ \ L点 y(n)=IDFT[Y(k)],  L
  6. X ( z k ) = W k 2 2 y ( k ) ,    0 ≤ k ≤ M − 1 X(z_k)=W^{\frac{k^2}{2}}y(k),\ \ 0 \le k \le M-1 X(zk)=W2k2y(k),  0kM1

上述步骤实现程序可见Matlab的czt函数内部程序。

仿真分析

此处使用函数czt实现Chirp-Z变换,并将结果与DFT和采样序列插0后序列的DFT进行对比。

clc;clear;close all;
N = 8192;
f1 = 100;
f2 = 101;
fs = 8000;
Ts = 1/fs; 
ts = (1:N)*Ts;
x = cos(2*pi*f1*ts) + cos(2*pi*f2*ts) + 0.5*randn(1,N); 
y_DFT = abs(fft(x)); %%DFT
w = exp(-1i*2*pi*(150-50)/(N*fs));
a = exp(1i*2*pi*50/fs);
y_CZT = abs(czt(x,N,w,a));%%CZT

fn = (0:N-1)/N;
fy = fs*fn;
fz = (150-50)*fn + 50;
fyy = fs*(0:2*N-1)/(2*N);
xx = [x zeros(1,N)];
yy_DFT = abs(fft(xx)); %%插0 DFT
plot(yy_DFT);
plot(fy,20*log10(y_DFT), fz,20*log10(y_CZT), fyy,20*log10(yy_DFT));
xlim([80 120]);
legend('DFT','CZT','插0 DFT');

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/361442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运动型蓝牙耳机推荐哪款、最新运动蓝牙耳机推荐

提起运动耳机&#xff0c;如今很多运动爱好者和职业教练员们&#xff0c;都会向萌新推荐骨传导运动耳机。骨传导耳机解决了入耳式蓝牙耳机掉落的问题&#xff0c;佩戴相当舒服。骨传导耳机在佩戴过程中解放了双耳&#xff0c;不会因为耳机堵住耳朵&#xff0c;听不到环境音&…

【Spring6】| Spring启示录、Spring概述

目录 一&#xff1a;Spring启示录 1. OCP开闭原则 2. 依赖倒置原则DIP 3. 控制反转IoC 二&#xff1a;Spring概述 1. Spring简介 2. Spring8大模块 3. Spring特点 一&#xff1a;Spring启示录 引言&#xff1a;前面我们已经学习了三层架构&#xff1a;表示层、业务层、…

【工作笔记】syslog,kern.log大量写入invalid cookie错误信息问题

任务描述 错误出现出现过四五次&#xff0c;应该是诊断单元tf卡读写出问题导致下面这条告警一直高频写入到/var/log/下的syslog、kern.log、messages中 Nov 23 06:25:12 embest kernel: omap_hsmmc 48060000.mmc: [omap_hsmmc_pre_dma_transfer] invalid cookie: data->hos…

将maven项目打包成可执行的jar(加入外部依赖)

在有些场景下我们需要将编写的Java工程编译打包成为一个完整的jar包&#xff0c;如果你的项目是使用maven构建的话可以通过以下方法来完成这个打包的过程。添加maven打包插件。在项目的pom.xml配置文件的build标签中添加以下代码&#xff0c;其中 mainClass 属性需要替换成你项…

多种调度模式下的光储电站经济性最优储能容量配置分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

安装MQTT Server遇到报错“cannot verify mosquitto.org‘s certificate”,该如何解决?

MQTT是基于发布/订阅的轻量级即时通讯协议&#xff0c;很适合用于低带宽、不稳定的网络中进行远程传感器和控制设备通讯等操作中。在我们的软件研发中&#xff0c;也经常使用MQTT协议进行消息通信等。今天来和大家分享一些关于在安装MQTT Server中遇到的疑难问题及解决思路。当…

为什么阳康后,感觉自己变傻了?

不少人在阳康后出现脑力下降的情况&#xff0c;好像脑子里被雾笼罩。脑雾并不是新名词&#xff0c;已经存在了十几年。以前慢性疲劳综合征患者和脑震荡患者会用它来形容自己的症状。脑雾其实是认知障碍&#xff0c;它可由多种原因引起。比如过度劳累、长期酗酒、缺乏睡眠、久坐…

Semi-supervised(半监督)布料缺陷检测实战

数据及源码链接见文末 1.任务目标和流程概述 对于常规的缺陷检测,常常需要我们准备好数据,使用分割或者检测的方法选择模型,进行训练。但是有一个问题。在日常生产中,我们接触到的往往都是正常的,缺陷数据往往很难收集,更何况我们还要打标签。我们能不能通过训练正常数据…

独立搭建 handle server

本节主要介绍,如何搭建一个与 GHR隔离的 handle sever,不与外界有任何连通。 下载文件 访问地址下载最新版:http://www.handle.net/download_hnr.html 这里以 9.3.0 版本作为讲解 解压服务端,解压客户端 # 解压 tar -xzvf handle-9.3.0-distribution.tar.gz# 到目录下 …

NestJS学习:图片上传、下载

参考 大神的这两篇文章讲的很详细&#xff0c;这里自己也来试一下 小满nestjs&#xff08;第十三章 nestjs 上传图片-静态目录&#xff09; 小满nestjs&#xff08;第十四章 nestjs 下载图片&#xff09; 上传图片 安装包 需要&#xff1a;multer 和 nestjs/platform-expre…

深入理解Java的Lambda原理

1、前言 Lambda函数的概念其实有很久远的历史了&#xff0c;在Lisa&#xff0c;C#中早有实现。且近年来&#xff0c;开发者对语言的表现力有了更高的要求&#xff0c;Java也在JDK 1.8 中引入了Lambda函数这一概念。虽然截止到写下这段文字的一刻已经过去七年之久&#xff0c;但…

Mybatis框架详解(全)

目录 MyBatis简介 MyBatis整体架构及运行流程 1.数据源配置文件 2.Sql映射文件 3.会话工厂与会话 4.运行流程 mybatis实现增删改查 Mybatis的获取参数的方式 mapper中自定义映射 mybatis注解开发 mybatis缓存 mybatis分页插件 MyBatis简介 MyBatis 是一款优秀的持久…

程序员如何向架构师转型?看完就明白该怎么做了

软件行业技术开发从业人员众多&#xff0c;但具备若干年开发经验的普通的开发人员往往面临个人发展的瓶颈&#xff0c;即如何从普通开发人员转型成高层次的系统架构师和技术管理人员。想成为一名架构师&#xff0c;应当具备全面的知识体系&#xff0c;需要进行系统的学习和实践…

数组(一)-- LeetCode[26][80] 删除有序数组中的重复元素

1 删除有序数组中的重复项 1.1 题目描述 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次&#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度&#xff0c…

FreeRTOS与UCOSIII任务状态对比

FreeRTOS任务状态 1、运行态 正在运行的任务&#xff0c;正在使用处理器的任务。 单核处理器中任何时候都有且只有一个任务处于运行态。 2、就绪态 已经准备就绪&#xff08;非阻塞或挂起&#xff09;&#xff0c;可以立即运行但还没有运行的任务。 正在等待比自己高优先级…

Kafka——消息队列学习总结

定义 Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ)&#xff0c;主要应用于大数据实时处理领域。 模式 点对点模式 一对一&#xff0c;消费者主动拉取数据&#xff0c;消费收到后消息清除。 发布/订阅模式 一对多&#xff0c;消费者消费数据后不会清除消息…

JavaScript:使用for in不是一个很好的抉择

for in 如果让你遍历对象中的key和value&#xff0c;你第一个想到的一定是使用for in const o{name:"chengqige",age:23 } for (let key in o){console.log(key,o[key]); }看起来是没有问题的&#xff0c;但是如果我在下面加一行代码&#xff0c;输出的结果就可能让…

JUC并发编程——进程与线程

目录一、进程和线程的概念1.1 进程1.2 线程1.3 进程与线程对比二、并行和并发的概念三、线程基本应用3.1 多线程应用——异步调用一、进程和线程的概念 1.1 进程 ● 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 …

内容生态与新业务双突破,汽车之家反转逻辑将延续

2022年&#xff0c;疫情对汽车市场的影响不容忽视。但从财报来看&#xff0c;汽车之家在宏观压力下仍实现了有力的V型反转。 北京时间2月16日美股盘前&#xff0c;汽车之家发布2022Q4及全年财报。财报显示&#xff0c;其四季度实现总营收18.93亿元&#xff0c;同比增长11.8%。…

java并发笔记

文章目录HashMapput方法resize方法ConcurrentHashMapput方法initTable方法sizectl代表什么&#xff1a;扩容计数器ConcurrentHashMap的读操作会阻塞嘛AQS唤醒线程时&#xff0c;AQS为什么从后往前遍历&#xff1f;AQS为什么要有一个虚拟的head节点AQS为什么用双向链表&#xff…