采集信号的相似度计算

在单片机系统中进行信号采样和相似度计算,特别是在给出触发信号后,以1kHz的速率采样并保存数据作为标准数据,然后在下次触发周期采集数据并进行对比,可以使用交叉相关(Cross-Correlation)方法来对齐信号,并计算相似度。以下是对该过程的详细描述和示例代码:

步骤概述

  1. 首次触发采集标准数据:在第一次触发信号后,以1kHz的速率采集并保存标准数据。
  2. 再次触发采集新数据:在后续触发信号后,再次以1kHz的速率采集数据。
  3. 对齐信号:使用交叉相关方法对齐新采集的数据和标准数据。
  4. 计算相似度:使用皮尔逊相关系数或其他相似度度量方法计算对齐后的信号相似度。

如何计算相似度以及公式

在信号处理领域,相似度度量通常用于评估两个信号之间的相似性程度。最常用的方法之一是计算皮尔逊相关系数(Pearson Correlation Coefficient),它量化了两个信号之间的线性相关性。以下是计算相似度的详细步骤和公式。

皮尔逊相关系数

皮尔逊相关系数的公式如下:

r = ∑ i = 1 N ( x i − x ‾ ) ( y i − y ‾ ) ∑ i = 1 N ( x i − x ‾ ) 2 ∑ i = 1 N ( y i − y ‾ ) 2 r = \frac{\sum_{i=1}^N (x_i - \overline{x})(y_i - \overline{y})}{\sqrt{\sum_{i=1}^N (x_i - \overline{x})^2} \sqrt{\sum_{i=1}^N (y_i - \overline{y})^2}} r=i=1N(xix)2 i=1N(yiy)2 i=1N(xix)(yiy)

其中:

  • ( r ) 是皮尔逊相关系数,取值范围为 -1 到 1。
  • ( x_i ) 和 ( y_i ) 分别是信号 ( x ) 和 ( y ) 在第 ( i ) 个样本点的值。
  • ( \overline{x} ) 和 ( \overline{y} ) 分别是信号 ( x ) 和 ( y ) 的均值。
步骤概述
  1. 计算信号的均值:首先计算两个信号的均值。
  2. 计算分子:计算每对信号值与其均值的差的乘积的总和。
  3. 计算分母:分别计算两个信号值与其均值的差的平方和,然后取平方根,再将结果相乘。
  4. 计算相似度:将分子除以分母得到皮尔逊相关系数。
代码实现

详细步骤和代码示例

1. 首次触发采集标准数据

假设信号长度为 N,以数组 standard_signal 保存标准数据。

#define N 1000

float standard_signal[N];

// 在第一次触发信号后采集标准数据
void collect_standard_data() {
    for (int i = 0; i < N; i++) {
        standard_signal[i] = read_adc(); // read_adc() 是一个假设的函数,用于从ADC读取采样数据
        delay(1); // 延时1ms,对应1kHz采样率
    }
}
2. 再次触发采集新数据

假设以数组 new_signal 保存新采集的数据。

float new_signal[N];

// 在后续触发信号后采集新数据
void collect_new_data() {
    for (int i = 0; i < N; i++) {
        new_signal[i] = read_adc();
        delay(1);
    }
}
3. 对齐信号

计算交叉相关,并找到最佳对齐位置。

float correlation[2 * N - 1];

void cross_correlation(float signal1[], float signal2[], float correlation[]) {
    int i, j;
    for (i = 0; i < 2 * N - 1; i++) {
        correlation[i] = 0;
        for (j = 0; j < N; j++) {
            if (i - j >= 0 && i - j < N) {
                correlation[i] += signal1[j] * signal2[i - j];
            }
        }
    }
}

int find_max_correlation_index(float correlation[]) {
    int max_index = 0;
    float max_value = correlation[0];
    for (int i = 1; i < 2 * N - 1; i++) {
        if (correlation[i] > max_value) {
            max_value = correlation[i];
            max_index = i;
        }
    }
    return max_index;
}

void align_signals(float signal1[], float signal2[], float aligned_signal2[], int shift) {
    int i;
    if (shift > 0) {
        for (i = 0; i < N - shift; i++) {
            aligned_signal2[i] = signal2[i + shift];
        }
        for (i = N - shift; i < N; i++) {
            aligned_signal2[i] = 0;
        }
    } else {
        for (i = 0; i < -shift; i++) {
            aligned_signal2[i] = 0;
        }
        for (i = -shift; i < N; i++) {
            aligned_signal2[i] = signal2[i + shift];
        }
    }
}
4. 计算相似度

使用皮尔逊相关系数计算对齐后的信号相似度。

float calculate_similarity(float signal1[], float signal2[]) {
    float mean1 = 0, mean2 = 0;
    for (int i = 0; i < N; i++) {
        mean1 += signal1[i];
        mean2 += signal2[i];
    }
    mean1 /= N;
    mean2 /= N;

    float numerator = 0, denominator1 = 0, denominator2 = 0;
    for (int i = 0; i < N; i++) {
        numerator += (signal1[i] - mean1) * (signal2[i] - mean2);
        denominator1 += pow(signal1[i] - mean1, 2);
        denominator2 += pow(signal2[i] - mean2, 2);
    }

    return numerator / sqrt(denominator1 * denominator2);
}
主程序

整合以上步骤,实现信号采集、对齐和相似度计算的完整流程。

#include <stdio.h>
#include <math.h>

#define N 1000

float standard_signal[N];
float new_signal[N];
float correlation[2 * N - 1];
float aligned_signal2[N];

// 假设有个读取ADC的函数
float read_adc() {
    // 模拟读取ADC数据
    return (float)(rand() % 1024) / 1024.0;
}

// 模拟延时函数
void delay(int ms) {
    // 简单的延时模拟
    for (volatile int i = 0; i < ms * 1000; i++);
}

// 首次触发采集标准数据
void collect_standard_data() {
    for (int i = 0; i < N; i++) {
        standard_signal[i] = read_adc();
        delay(1);
    }
}

// 再次触发采集新数据
void collect_new_data() {
    for (int i = 0; i < N; i++) {
        new_signal[i] = read_adc();
        delay(1);
    }
}

// 交叉相关函数、找到最大相关性位置、对齐信号、计算相似度的函数前面已定义

int main() {
    // 第一次触发,采集标准数据
    collect_standard_data();

    // 模拟后续触发事件
    while (1) {
        // 再次触发,采集新数据
        collect_new_data();

        // 计算交叉相关
        cross_correlation(standard_signal, new_signal, correlation);

        // 找到最大相关性的位置
        int shift = find_max_correlation_index(correlation) - N + 1;

        // 对齐信号
        align_signals(standard_signal, new_signal, aligned_signal2, shift);

        // 计算相似度
        float similarity = calculate_similarity(standard_signal, aligned_signal2);
        printf("Shift: %d, Similarity: %f\n", shift, similarity);

        // 模拟等待下一次触发
        delay(1000);
    }

    return 0;
}

解释

  • 计算均值:通过遍历信号数组计算每个信号的均值。
  • 计算分子和分母:使用循环计算公式中的分子和分母部分。
  • 计算相似度:最终将分子除以分母得到相似度,即皮尔逊相关系数。

总结

该程序模拟了一个在单片机系统中采集和处理信号的过程,包括信号采集、交叉相关计算、信号对齐以及相似度计算。可以根据实际的硬件环境和具体需求进行调整和优化。

皮尔逊相关系数提供了一种简单而有效的方法来量化两个信号之间的相似度。当信号完全线性相关时,相关系数为 1 或 -1;当信号完全不相关时,相关系数为 0。该方法在信号处理和数据分析中广泛应用,可以用于各种相似度测量场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】C++ 超市会员卡管理系统(面向对象)(源码+数据)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【从零开始学架构 架构基础】五 架构设计的复杂度来源:低成本、安全、规模

架构设计的复杂度来源其实就是架构设计要解决的问题&#xff0c;主要有如下几个&#xff1a;高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键&#xff0c;就是新旧技术之间不是完全的替代关系&#xff0c;有交叉&#xff0c;有各自的特点&#xff0c;所以才需要具体…

解决idea中git无法管理项目中所有需要管理的文件

点击文件->设置 选择版本控制—>目录映射 点击加号 设置整个项目被Git管理

springboot助农电商系统-计算机毕业设计源码08655

摘要 近年来&#xff0c;电子商务的快速发展引起了行业和学术界的高度关注。基于移动端的助农电商系统旨在为用户提供一个简单、高效、便捷的农产品购物体验&#xff0c;它不仅要求用户清晰地查看所需信息&#xff0c;而且还要求界面设计精美&#xff0c;使得功能与页面完美融…

【GPU虚拟化到池化技术深度分析 2024】

文末有福利&#xff01; 随着大模型的兴起&#xff0c;对GPU算力的需求越来越多&#xff0c;而当前现实情况使企业往往受限于有限的GPU卡资源&#xff0c;即便进行了虚拟化&#xff0c;往往也难以充分使用GPU卡资源或持续使用资源。为解决GPU算力资源不均衡等问题&#xff0c;…

国标GB/T 28181详解:国标GBT28181-2022第三方呼叫控制的视音频文件下载流程

目录 一、定义 1、国标GB/T 28181 2、第三方呼叫控制的视音频文件下载流程 二、作用 1、提供有效的数据回顾机制 2、增强监控系统的功能性 3、保障数据传输与存储的可靠性 4、实现精细化的操作与控制 5、促进监控系统的集成与发展 6、提供清晰的信令流程和操作规范 三…

驱动开发:配置Visual Studio驱动开发环境

100编程书屋_孔夫子旧书网 配置驱动开发环境配置驱动开发模板配置驱动双机调试 在正式开始驱动开发之前&#xff0c;需要自行搭建驱动开发的必要环境&#xff0c;首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具&#xff0c;在课件内请双击ISO文件并运行内部的…

基于web的产品管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于web的产品管理系统,java项目。 ecli…

5G RAN

两个entity&#xff1a;NodeB、UE entity之间传输数据的东东 entity内部的流水线岗位&#xff1a;L3/L2/L1 岗位之间是消息交互/信令交互

阿里云centos7.9 挂载数据盘到 www目录

一、让系统显示中文 参考&#xff1a;centos7 怎么让命令行显示中文&#xff08;英文-&#xff1e;中文&#xff09;_如何在命令行中显示中文-CSDN博客 1、输入命令&#xff1a;locale -a |grep "zh_CN" 可以看到已经存在了中文包 2、输入命令&#xff1a;sudo vi…

在Clion使用CubeMX Stm32的步骤

Step1 准备软件&#xff0c;安装环境&#xff1a; 1. cubemx v6.5.0&#xff08;可以兼容以前版本的project&#xff09; https://www.st.com.cn/zh/development-tools/stm32cubemx.html STM32CubeMX 默认安装目录, 6.5版本可以兼容老版本 C:\Program Files\STMicroelectroni…

Golang | Leetcode Golang题解之第199题二叉树的右视图

题目&#xff1a; 题解&#xff1a; /** 102. 二叉树的递归遍历*/ func levelOrder(root *TreeNode) [][]int {arr : [][]int{}depth : 0var order func(root *TreeNode, depth int)order func(root *TreeNode, depth int) {if root nil {return}if len(arr) depth {arr a…

3D Web轻量引擎HOOPS Web Platform赋能AEC行业数字化,高效渲染与多格式支持!

在建筑、工程和施工&#xff08;AEC&#xff09;行业&#xff0c;数字化转型和高效协作正变得越来越重要。为应对日益复杂的项目需求和不断提升的质量标准&#xff0c;AEC企业需要一种强大的工具来实现高效的3D可视化和数据管理。HOOPS Web Platform作为一款综合性3D开发平台&a…

金融科技如何多角度助力小微企业融资

一、引言 在全球化与数字化交织的时代背景下&#xff0c;金融科技&#xff08;FinTech&#xff09;作为新兴力量&#xff0c;正逐步改变传统的金融业态&#xff0c;尤其在助力小微企业融资方面&#xff0c;金融科技展现出了多元化的价值和优势。本文将从不同角度探讨金融科技如…

python操作elasticsearch

1、安装 首先&#xff0c;确保你已经安装了elasticsearch库。如果没有安装&#xff0c;可以使用pip进行安装&#xff1a; pip install elasticsearch 如下&#xff1a; 2、测试是否联通 输入 python 进入交互模式。然后依次输入一下命令。 from elasticsearch import Elas…

uniapp启动页面鉴权页面闪烁问题

在使用uni-app开发app 打包完成后如果没有token&#xff0c;那么就在onLaunch生命周期里面判断用户是否登录并跳转至登录页。 但是在app中页面会先进入首页然后再跳转至登录页&#xff0c;十分影响体验。 处理方法&#xff1a; 使用plus.navigator.closeSplashscreen() 官网…

Nginx网站服务详解(设置并发数、实现不同虚拟主机等)

一、nginx的最大并发数设置已经状态收集模块 [root192 nginx]# cat nginx.conf # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/user ngin…

【仪器仪表】为什么要对线材做摇摆测试?

在工作中,我们可能会看到下图所示的机器。它就是线材弯折试验机,又叫线材弯折摇摆试验机、插头引线弯折试验机等。 线缆生产厂家和质检部门对电源线、DC线进行弯曲试验都需要这样的仪器,以便验证线缆是否符合设计标准。 线材弯折试验的作用 线材弯折试验机是线材的一种质检…

谷粒商城-个人笔记(集群部署篇一)

前言 ​学习视频&#xff1a;​Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强​学习文档&#xff1a; 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

顺序表应用——通讯录

在本篇之前的顺序表专题我们已经学习的顺序表的实现&#xff0c;了解了如何实现顺序表的插入和删除等功能&#xff0c;那么在本篇当中就要学习基于顺序表来实现通讯录&#xff0c;在通讯录当中能实现联系人的增、删、查改等功能&#xff0c;接下来就让我们一起来实现通讯录吧&a…
最新文章