Jacky's blog Jacky's blog
首页
  • 编码专题
  • 深入浅出 Vite
  • 深入浅出 babel
  • 快速上手API
  • 深入浅出 react
  • Node

    • code-notebook
  • 状态管理

    • redux
  • 前端工程化

    • Wepack
  • React源码

    • React源码
  • 组件库封装

    • 组件库
  • 开发工具

    • Vscode 插件
  • 项目展示
  • 案例中心 (opens new window)
  • First Project
  • 基础算法题
  • 链表题
  • 动态规划
  • 双指针
  • 递归
  • 数据结构
  • 前端学习计划 (opens new window)
  • 技术随笔
  • 转载文章
  • 包管理工具
  • 前端学习周报
  • VSCode插件
  • Promise 专题
  • 函数技巧
  • React 专题
  • 配置文件

    • TSCONFIG-配置 (opens new window)
    • NGINX-配置 (opens new window)
    • 正则规则查询手册 (opens new window)
    • Lint 配置 (opens new window)
  • 教程

    • GIT-教程
    • NPM SCRIPTS-工作流 (opens new window)
    • DOCKER-教程 (opens new window)
    • LERNA-教程 (opens new window)
    • GIT-常用操作整理 (opens new window)
  • VSCode

    • LAUNCH.JSON (opens new window)
  • 指令

    • NPM 指令 (opens new window)
    • NVM 指令 (opens new window)
    • Nginx 指令 (opens new window)
    • YARN 指令 (opens new window)
    • PNPM 指令 (opens new window)
  • 库

    • FS-EXTRA 库 (opens new window)
    • NODE 库-PATH (opens new window)
  • 永远的神

    • 魔法师卡颂-自顶向下学 React 源码 (opens new window)
    • 全栈潇晨 (opens new window)
    • 博客-程序员山月-Daily (opens new window)
    • 淘系前端:冴羽 (opens new window)
  • 系列文章

    • 《图解HTTP》 (opens new window)
    • 《ES6标准入门》 (opens new window)
    • 《现代JavaScript教程》 (opens new window)
    • 《深入浅出Webpack》 (opens new window)
    • VSCode 插件系列:小茗同学 (opens new window)
    • JEST 教程 (opens new window)
    • 前端精读周刊:各种精读系列 (opens new window)
    • 一文吃透系列 (opens new window)
    • 图解 REACT 原理 (opens new window)
  • 实用网站

    • MDN (opens new window)
    • CAN I USE (opens new window)
    • TYPESCRIPT-ESLint-RULES (opens new window)
    • ESLint-RULES (opens new window)
    • FRONT-END TREND (opens new window)
    • NPM TREND (opens new window)
    • 在线分析 Node 依赖 (opens new window)
    • FIND NPM (opens new window)
    • CODE PEN (opens new window)
    • 印记中文 (opens new window)
    • TOOL.LU (opens new window)
    • 阮一峰-网道 (opens new window)
    • DIGITAL OCEAN (opens new window)
    • DEVDOCS.IO (opens new window)
    • JOI (opens new window)
  • 算法

    • 小浩算法 (opens new window)
    • LABULADONG 的算法小抄 (opens new window)
    • 力扣 SOLUTION (opens new window)
    • HACKER RANK (opens new window)
    • 代码随想录 (opens new window)
  • 博客系列

    • 美团大佬 (opens new window)
    • 蜡笔小伟 (opens new window)
    • 优秀博客1 (opens new window)
    • 优秀博客2-umi (opens new window)
    • 优质博客 (opens new window)
  • CSS

    • CSS-EASING 库 (opens new window)
    • ROUGH.JS (opens new window)
    • CSS 网站收集
    • UNOCSS (opens new window)
  • 前端

    • PROMISE (opens new window)
    • UNDERSCORE.JS (opens new window)
    • study with BGM (opens new window)
    • nginx【B站视频】 (opens new window)
    • 机器学习
    • Js基础
  • 掘金已购课程

    • 前端自动化测试精讲 (opens new window)
    • 深入浅出 Vite (opens new window)
    • 现代 Web 布局 (opens new window)
    • 前端算法与数据结构 (opens new window)
    • 基于 Vite 的 SSG 框架开发实战 (opens new window)
    • SSR 实战:官网开发指南 (opens new window)
    • WebGL 入门与实践 (opens new window)
    • 玩转 CSS 的艺术之美 (opens new window)
    • 前端调试通关秘籍 (opens new window)
    • React 进阶实践指南 (opens new window)
    • TypeScript 全面进阶指南 (opens new window)
    • 前端缓存技术与方案解析 (opens new window)
    • npm scripts 前端工作流 (opens new window)
    • Webpack5 核心原理与应用实践 (opens new window)
  • 购物车

    • 张鑫旭-技术写作指南 (opens new window)
    • 深入剖析 Node.js 底层原理 (opens new window)
    • 前端开发者的现代 C++ 课 (opens new window)
    • 从前端到全栈 (opens new window)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Jacky Wang

行到水穷处,坐看云起时
首页
  • 编码专题
  • 深入浅出 Vite
  • 深入浅出 babel
  • 快速上手API
  • 深入浅出 react
  • Node

    • code-notebook
  • 状态管理

    • redux
  • 前端工程化

    • Wepack
  • React源码

    • React源码
  • 组件库封装

    • 组件库
  • 开发工具

    • Vscode 插件
  • 项目展示
  • 案例中心 (opens new window)
  • First Project
  • 基础算法题
  • 链表题
  • 动态规划
  • 双指针
  • 递归
  • 数据结构
  • 前端学习计划 (opens new window)
  • 技术随笔
  • 转载文章
  • 包管理工具
  • 前端学习周报
  • VSCode插件
  • Promise 专题
  • 函数技巧
  • React 专题
  • 配置文件

    • TSCONFIG-配置 (opens new window)
    • NGINX-配置 (opens new window)
    • 正则规则查询手册 (opens new window)
    • Lint 配置 (opens new window)
  • 教程

    • GIT-教程
    • NPM SCRIPTS-工作流 (opens new window)
    • DOCKER-教程 (opens new window)
    • LERNA-教程 (opens new window)
    • GIT-常用操作整理 (opens new window)
  • VSCode

    • LAUNCH.JSON (opens new window)
  • 指令

    • NPM 指令 (opens new window)
    • NVM 指令 (opens new window)
    • Nginx 指令 (opens new window)
    • YARN 指令 (opens new window)
    • PNPM 指令 (opens new window)
  • 库

    • FS-EXTRA 库 (opens new window)
    • NODE 库-PATH (opens new window)
  • 永远的神

    • 魔法师卡颂-自顶向下学 React 源码 (opens new window)
    • 全栈潇晨 (opens new window)
    • 博客-程序员山月-Daily (opens new window)
    • 淘系前端:冴羽 (opens new window)
  • 系列文章

    • 《图解HTTP》 (opens new window)
    • 《ES6标准入门》 (opens new window)
    • 《现代JavaScript教程》 (opens new window)
    • 《深入浅出Webpack》 (opens new window)
    • VSCode 插件系列:小茗同学 (opens new window)
    • JEST 教程 (opens new window)
    • 前端精读周刊:各种精读系列 (opens new window)
    • 一文吃透系列 (opens new window)
    • 图解 REACT 原理 (opens new window)
  • 实用网站

    • MDN (opens new window)
    • CAN I USE (opens new window)
    • TYPESCRIPT-ESLint-RULES (opens new window)
    • ESLint-RULES (opens new window)
    • FRONT-END TREND (opens new window)
    • NPM TREND (opens new window)
    • 在线分析 Node 依赖 (opens new window)
    • FIND NPM (opens new window)
    • CODE PEN (opens new window)
    • 印记中文 (opens new window)
    • TOOL.LU (opens new window)
    • 阮一峰-网道 (opens new window)
    • DIGITAL OCEAN (opens new window)
    • DEVDOCS.IO (opens new window)
    • JOI (opens new window)
  • 算法

    • 小浩算法 (opens new window)
    • LABULADONG 的算法小抄 (opens new window)
    • 力扣 SOLUTION (opens new window)
    • HACKER RANK (opens new window)
    • 代码随想录 (opens new window)
  • 博客系列

    • 美团大佬 (opens new window)
    • 蜡笔小伟 (opens new window)
    • 优秀博客1 (opens new window)
    • 优秀博客2-umi (opens new window)
    • 优质博客 (opens new window)
  • CSS

    • CSS-EASING 库 (opens new window)
    • ROUGH.JS (opens new window)
    • CSS 网站收集
    • UNOCSS (opens new window)
  • 前端

    • PROMISE (opens new window)
    • UNDERSCORE.JS (opens new window)
    • study with BGM (opens new window)
    • nginx【B站视频】 (opens new window)
    • 机器学习
    • Js基础
  • 掘金已购课程

    • 前端自动化测试精讲 (opens new window)
    • 深入浅出 Vite (opens new window)
    • 现代 Web 布局 (opens new window)
    • 前端算法与数据结构 (opens new window)
    • 基于 Vite 的 SSG 框架开发实战 (opens new window)
    • SSR 实战:官网开发指南 (opens new window)
    • WebGL 入门与实践 (opens new window)
    • 玩转 CSS 的艺术之美 (opens new window)
    • 前端调试通关秘籍 (opens new window)
    • React 进阶实践指南 (opens new window)
    • TypeScript 全面进阶指南 (opens new window)
    • 前端缓存技术与方案解析 (opens new window)
    • npm scripts 前端工作流 (opens new window)
    • Webpack5 核心原理与应用实践 (opens new window)
  • 购物车

    • 张鑫旭-技术写作指南 (opens new window)
    • 深入剖析 Node.js 底层原理 (opens new window)
    • 前端开发者的现代 C++ 课 (opens new window)
    • 从前端到全栈 (opens new window)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数字信号处理

    • 数字信号处理--FIR的线性相位特性
    • 数字信号处理 -- Z 变换
    • 数字信号处理--Z变换之极零分析
    • 数字信号处理--功率谱估计
    • 数字信号处理--全通系统与最小相位系统
    • 数字信号处理--相关函数
      • 为什么要用相关函数表示相似度?
      • 相关函数的定义
        • x(n)​为能量信号
        • x(n)​为功率信号
      • 均匀分布函数rand
      • 高斯分布函数randn
      • 线性卷积conv
  • scikit-learn-机器学习常用算法原理及编程实战

  • 读书笔记
  • 数字信号处理
wangjiasheng
2020-03-31
目录

数字信号处理--相关函数

在信号处理中经常要研究两个信号的相似性,以及一个信号经过一段延迟后自身的相似性。

# 为什么要用相关函数表示相似度?

之前研究两个信号的相似性,我们会用归一化相关系数来表征:

ρxy=∑n=0∞x(n)y(n)[∑n=0∞x2(n)∑n=0∞y2(n)]1/2\rho_{xy}=\frac{\sum_{n=0}^\infin x(n)y(n)}{[\sum_{n=0}^\infin x^2(n)\sum_{n=0}^\infin y^2(n)]^{1/2}} ρxy​=[∑n=0∞​x2(n)∑n=0∞​y2(n)]1/2∑n=0∞​x(n)y(n)​

其中定义相关系数:

rxy=∑n=0∞x(n)y(n)r_{xy} = \sum_{n=0}^\infin x(n)y(n) rxy​=n=0∑∞​x(n)y(n)

  • 当x(n)=y(n)x(n)=y(n)x(n)=y(n)时,ρxy=1\rho_{xy}=1ρxy​=1,两个信号完全相关,这是rxyr_{xy}rxy​取最大

  • 当x(n)x(n)x(n) 与y(n)y(n)y(n)完全无关时,rxy=0,ρxy=0r_{xy}=0,\rho_{xy}=0rxy​=0,ρxy​=0

  • 当x(n)x(n)x(n) 与y(n)y(n)y(n)存在某种程度的相似时,rxy≠0,∣ρxy∣r_{xy}\ne 0,|\rho_{xy}|rxy​​=0,∣ρxy​∣在 0 和 1 中间取值

但是相关函数存在局限性,如正余弦信号。正弦和余弦具有很大的相似性,但是计算ρxy=rxy=0\rho_{xy}=r_{xy}=0ρxy​=rxy​=0

# 相关函数的定义

# x(n)​为能量信号

自相关函数:

rx(m)=∑n=−∞∞x(n)x(n+m)r_x(m) = \sum_{n=-\infin}^{\infin}x(n)x(n+m) rx​(m)=n=−∞∑∞​x(n)x(n+m)

互相关函数:

rxy(m)=∑n=−∞∞x(n)y(n+m)r_{xy}(m) = \sum_{n=-\infin}^{\infin}x(n)y(n+m) rxy​(m)=n=−∞∑∞​x(n)y(n+m)

注:互相关函数不满足交换性,满足:

rxy(m)=ryx(−m)r_{xy}(m) = r_{yx}(-m) rxy​(m)=ryx​(−m)

不满足的原因是,后面那个信号是延迟,所以互相关函数的还有的定义也可为:

rxy(m)=∑n=−∞∞x(n−m)y(n)r_{xy}(m)=\sum_{n=-\infin}^{\infin}x(n-m)y(n) rxy​(m)=n=−∞∑∞​x(n−m)y(n)

# x(n)​为功率信号

研究rx(0)r_x(0)rx​(0)可以发现:

rx(0)=∑n=−∞∞x(n)2r_x(0)=\sum_{n=-\infin}^{\infin}x(n)^2 rx​(0)=n=−∞∑∞​x(n)2

即rx(0)r_x(0)rx​(0)等同于信号自身的能量,若信号不是能量信号,趋于无限大(功率信号),其相关函数定义为:

rxy(m)=lim⁡N→∞12N+1∑n=−NNx(n)y(n+m)r_{xy}(m) = \lim_{N\rightarrow\infin}\frac{1}{2N+1}\sum_{n=-N}^{N}x(n)y(n+m) rxy​(m)=N→∞lim​2N+11​n=−N∑N​x(n)y(n+m)

进一步,若x(n)x(n)x(n)为周期信号,无限多个周期信号的求和,可用一个周期的求和平均代替

rx(m)=1N∑n=0N−1x(n)x(n+m)r_x(m)=\frac{1}{N}\sum_{n=0}^{N-1}x(n)x(n+m) rx​(m)=N1​n=0∑N−1​x(n)x(n+m)

注:以上只是理论公式,实际中信号是有限长度的,实际代码公式见下


例题:令x(n)=sin(wn)x(n)=sin(wn)x(n)=sin(wn),其周期为 N,即w=2πNw=\frac{2\pi}{N}w=N2π​,求x(n)x(n)x(n)的自相关函数。

周期功率信号:

rx(m)=1N∑n=0N−1x(n)x(n+m)=1N∑n=0N−1sin(wn)sin(wn+wm)=cos⁡(ωm)1N∑n=0N−1sin⁡2(ωn)+sin⁡(ωm)1N∑n=0N−1sin⁡(ωn)cos⁡(ωn)=12cos(wm)\begin{aligned} r_x(m) =& \frac{1}{N}\sum_{n=0}^{N-1}x(n)x(n+m) =\frac{1}{N}\sum_{n=0}^{N-1}sin(wn)sin(wn+wm) \\ = & \cos (\omega m) \frac{1}{N} \sum_{n=0}^{N-1} \sin ^{2}(\omega n)+\sin (\omega m) \frac{1}{N} \sum_{n=0}^{N-1} \sin (\omega n) \cos (\omega n) \\ = & \frac{1}{2}cos(wm) \end{aligned} rx​(m)===​N1​n=0∑N−1​x(n)x(n+m)=N1​n=0∑N−1​sin(wn)sin(wn+wm)cos(ωm)N1​n=0∑N−1​sin2(ωn)+sin(ωm)N1​n=0∑N−1​sin(ωn)cos(ωn)21​cos(wm)​


# 相关函数的应用

相关函数的应用很广,噪声中的信号检测,信号中隐含周期性的检测,信号相关性的检测,信号时延长度的测量等。相关函数还是描述随机信号的重要统计量。

观察的信号x(n)x(n)x(n)由真正的信号s(n)s(n)s(n)和白噪声u(n)u(n)u(n)所组成,即x(n)=s(n)+u(n)x(n)=s(n)+u(n)x(n)=s(n)+u(n)。假定s(n)s(n)s(n)是周期的,周期为MMM,x(n)x(n)x(n)的长度为NNN,那么x(n)x(n)x(n)的自相关

rx(m)=1N∑n=0N−1[s(n)+u(n)][s(n+m)+u(n+m)]=rs(m)+rus(m)+rsu(m)+ru(m)\begin{aligned} r_x(m) = & \frac{1}{N} \sum_{n=0}^{N-1}[s(n)+u(n)][s(n+m)+u(n+m)] \\ =& r_s(m) + r_{us}(m)+r_{su}(m) + r_u(m) \end{aligned} rx​(m)==​N1​n=0∑N−1​[s(n)+u(n)][s(n+m)+u(n+m)]rs​(m)+rus​(m)+rsu​(m)+ru​(m)​

式中:

  • rus(m)r_{us}(m)rus​(m)和rsu(m)r_{su}(m)rsu​(m)是s(n)s(n)s(n)和u(n)u(n)u(n)的互相关,一般噪声是随机的,所以这两项会非常小。
  • ru(m)r_u(m)ru​(m)是噪声的自相关,就m=0m=0m=0时有值。
  • 若rs(m)r_s(m)rs​(m)是周期函数,则rx(m)r_x(m)rx​(m)则也是呈现周期变换的,分别在周期点上呈现峰值。

例题:设信号x(n)x(n)x(n)由正弦信号加均值为零的白噪声组成,正弦信号幅值为 1,白噪声的方差为 1,时域波形图无法发现有正弦信号,但是根据**相关函数的性质(若原信号中周期,则相关函数也是周期信号)**可以分辨出正弦信号。

正弦加白噪声信号的自相关函数
N = 50000;
p1 = 1;p2 = 0.1; % 设置功率
f = 1/8;
Mlag =60; % 选择m的长度,注要远远小于N
u = randn(1,N);
n = 0:N-1;
s = sin(2*pi*f*n);
x1 = u*sqrt(p1) + s ;rx1 = xcorr(x1,Mlag,'biased');
x2 = u*sqrt(p2) + s ;rx2 = xcorr(x2,Mlag,'biased');
% 绘图
subplot 221;plot(1:Mlag,x1(1:Mlag));grid on;xlabel('时域波形图')
subplot 222;plot(rx1(Mlag+1:end));grid on;xlabel('相关函数')
subplot 223;plot(1:Mlag,x2(1:Mlag));grid on;xlabel('时域波形图')
subplot 224;plot(rx2(Mlag+1:end));grid on;xlabel('相关函数')
set(gcf,'color','w')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# Maltab 函数

# 均匀分布函数rand

通过直方图可以发现rand产生的是均匀分布的数据,时域图中看不出。

观察直方图

代码:

clear ;
N = 5000;u = rand(1,N);
u_mean = mean(u); % 0.5094
power_u = var(u); % 0.0812
subplot 211; plot(u(1:100));grid on ;
subplot 212; hist(u,50);grid on ;
1
2
3
4
5
6

var的数学公式:

V=1N−1∑i=1N∣Ai−μ∣2V = \frac{1}{N-1}\sum_{i=1}^N |A_i-\mu|^2 V=N−11​i=1∑N​∣Ai​−μ∣2


产生一均匀分布、均值为零、功率为 0.01的白噪声信号u(n)u(n)u(n)。

其中P=0.01P=0.01P=0.01是希望达到的功率,通过调整信号的幅值可达到:

P=(u(n)/a)2Na=(u2(n)/(N∗P))=(σu2/P)\begin{aligned} P = & \frac{(u(n)/{a})^2}{N}\\ a =&\sqrt(u^2(n)/(N*P)) = \sqrt(\sigma^2_u/P) \end{aligned} P=a=​N(u(n)/a)2​(​u2(n)/(N∗P))=(​σu2​/P)​

观察幅值
P = 0.01;
N = 5000;
u = rand(1,N);
u = u - mean(u);
a = sqrt(var(u)/P);u1 = u/a;
power_u1 = u1*u1'/N; % 0.0100
plot(u1(1:100));grid on;
1
2
3
4
5
6
7

# 高斯分布函数randn

产生零均值、功率为 0.1,服从高斯分布的白噪声信号u(n)u(n)u(n)

P = 0.1;
N = 5000;
u = randn(1,N);
a = sqrt(P);
u = u*a;
power_u = var(u);
subplot 211
plot(u(1:100));grid on;xlabel('时域波形图')
subplot 212
hist(u,50);grid on;xlabel('相关函数')
set(gcf,'color','w')
1
2
3
4
5
6
7
8
9
10
11

# 线性卷积conv

令x(n)=(1,2,3,4,5),h(n)=(6,2,3,6,4,2),y(n)=x(n)∗h(n)x(n)=(1,2,3,4,5),h(n)=(6,2,3,6,4,2),y(n)=x(n)*h(n)x(n)=(1,2,3,4,5),h(n)=(6,2,3,6,4,2),y(n)=x(n)∗h(n),求y(n)y(n)y(n)

x=[1,2,3,4,5]; h=[6,2,3,6,4,2];
y=conv(x,h);
% 绘图
N=5;M=6;L=N+M-1;% 对应的长度为
nx=0:N-1; nh=0:M-1; ny=0:L-1; %横坐标
subplot 131; stem(nx,x,'.'); xlabel('n'); ylabel('x(n)'); grid on;
subplot 132; stem(nh,h,'.'); xlabel('n'); ylabel('h(n)');grid on;
subplot 133; stem(ny,y,'.'); xlabel('n'); ylabel('y(n)'); grid on;
set(gcf,'color','w')
1
2
3
4
5
6
7
8
9

注意观察卷积后的长度为:L=N+M−1L = N+M-1L=N+M−1

# 相关函数xcorr

在实际运算中,信号x(n)x(n)x(n)总是有限长,对应不同的mmm值,对应相乘与求和的数据长度是不同的,即

rx(m)=1N∑n=0N−1−mxN(n)xN(n+m)r_x(m) = \frac{1}{N}\sum_{n=0}^{N-1-m}x_N(n)x_N(n+m) rx​(m)=N1​n=0∑N−1−m​xN​(n)xN​(n+m)

若 m 越大,使用信号的有效长度就越短,计算出的rx(m)r_x(m)rx​(m)的性能就越差,要求m<<Nm<<Nm<<N。理论公式中能量信号与功率信号的相关函数公式不同,代码中一般都除以数据的长度 N。

自相关:rx=xcorr(x,m,'flag')

参数:

  • flag=biased有偏估计,分母是NNN
  • flag=unbiased无偏估计,分母是N−mN-mN−m

具体案例见相关函数的应用

这里调用程序存在两个问题?

  1. 为什么这里 flag 要用有偏估计?

  2. m 为什么要远远小于 N?

  3. xcorr 不能用,需要平移一段

    >> x = [1,2,3]
    x =
         1     2     3
    >> xcorr(x)
    ans =
        3.0000    8.0000   14.0000    8.0000    3.0000
    
    1
    2
    3
    4
    5
    6
编辑 (opens new window)
#数字信号处理
上次更新: 2022/04/06, 15:04:00
数字信号处理--全通系统与最小相位系统
第2章Python机器学习软件包

← 数字信号处理--全通系统与最小相位系统 第2章Python机器学习软件包→

最近更新
01
如何理解浏览器的 user agent 用户代理的含义?
11-05
02
浏览器事件循环机制
10-31
03
浏览器页面渲染机制【2023】
10-15
更多文章>
Theme by Vdoing | Copyright © 2020-2023
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式