脑电波控制设备:基于典型相关分析(CCA)的脑机接口频率精准解码方法
文章目录
- 前言
- 一、CCA的用途
- 二、频率求解思路
- 三、输入数据结构
- 四、判断方法
- 五、matlab实践
- 1.数据集获取及处理
- 2.matlab代码
- 3.运行及结果
- 六、参考文献
前言
在脑机接口(BCI)领域,有SSVEP方向,中文叫做稳态视觉诱发电位,当人观看闪烁的视觉刺激(比如闪烁的灯光或图像)时,大脑会在与刺激频率一致的频率上,产生电位波动。这段脑电波是一种稳定且容易检测的脑电信号。通过确定ssvep波的频率,可以准确地判断用户正专注于哪个视觉刺激目标,帮助BCI系统识别用户意图,从而控制相应的设备或应用。例如,用户可以通过注视不同频率的方块或图标来控制计算机光标、游戏角色、轮椅等设备。还可以通过确定频率成分,对脑部健康状况进行初步筛查或监控,进而识别一些可能的脑部异常活动。
一、CCA的用途
过去广泛使用的频率检测方法是PSDA,基于功率谱密度的分析,例如傅里叶变换,小波变换等。CCA(典型相关分析,Canonical Correlation Analysis) 是一种多变量统计分析方法,用于研究两组变量之间的相关性。在SSVEP-BCI(稳态视觉诱发电位-脑机接口)系统中,通常利用CCA来提取信号的频率特征并解码用户的意图。CCA的核心目标是通过求解典型相关系数来寻找两个信号集之间的关联性。
The most widely used frequency detection method in SSVEP-based BCIs is power spectral density based analysis。(PSDA)在基于SSVEP的脑机接口中,最广泛使用的频率检测方法是基于功率谱密度的分析。
二、频率求解思路
使用CCA,需要输入两个变量, X X X 和 Y Y Y。 X X X 是采集到的数据, Y Y Y 是用已知的标准正余弦信号做为模板进行预设的数据。CCA旨在找到一对变换矩阵 A A A 和 B B B ,使得变换后的两个信号集之间的相关性最大化。相关性就体现在相关系数 p p p 的求解上:
max ρ = cov ( A X , B Y ) cov ( A X , A X ) ⋅ cov ( B Y , B Y ) \text{max} \quad \rho = \frac{ \text{cov}(A X, B Y) }{ \sqrt{ \text{cov}(A X, A X) \cdot \text{cov}(B Y, B Y) } } maxρ=cov(AX,AX)⋅cov(BY,BY)cov(AX,BY)
在得到的所有系数中,找到最大的系数。最大系数对应的频率,与SSVEP波频率相关性最大,就代表了SSVEP波的频率就是这个值。
三、输入数据结构
使用数据结构说明如下描述,看图辅助文字理解。输入 x x x 的行数为通道数8, x x x 是采集到的数据。输入 y y y 行数为使用的谐波数6, y y y 是标准正余弦信号。 x x x 和 y y y 两者的列数为时间t。
输入的 x x x 和 y y y 数据结构如下图
y y y 是标准正余弦信号,是下图这样的形式
CCA works on two sets of variables. In our method, variables in one set are the signals, x(t),recorded from several channels within a local region and the second set is from stimulus signals.
CCA处理两组变量。在我们的方法中,一组变量x(t)是从局部区域内的几个通道记录的信号,第二组变量来自刺激信号。
四、判断方法
相关系数最大时的频率,就是我们要找的频率。而相关系数 p = λ 2 p=λ² p=λ2 ,这个关系由CCA理论推导得到。篇幅所限这里只记结论,详情可以看这篇,理论学习部分典型相关分析(CCA)探索多维数据间的深层关系:基于Matlab,内有详细推导,包教包会。这里想求出 p p p ,只要找到对应特征值,开根号就好了。
Suppose there are K stimulus frequencies f1,f2,…fk and that the analyzed signal has been acquired from N channels within an Ls window. Our strategy for recognition is as follows. where p(f) is the CCA coefficient of xLN and y.
假设有K个刺激频率 f1,f2,…fk,并且所分析的信号是在一个长度为Ls的窗口内从N个通道中获取的。我们的识别策略如下。刺激频率fs满足 p(f) 是 xLN 和 y 的 CCA 系数。In this approach, EEG signals from multiple channels are used to calculate the CCA coefficients with all stimulus frequencies in the system. The frequency with the largest coefficient is the one of SSVEP.
在该方法中,使用EEG信号来自多个通道,来计算系统中所有刺激频率的CCA系数。具有最大系数的频率是SSVEP的频率。
五、matlab实践
1.数据集获取及处理
使用清华大学脑机接口研究组的公开数据集,链接 https://bci.med.tsinghua.edu.cn/
此处下载使用Wearable SSVEP BCI Dataset的S1~S10。
该数据集刺激信息如下图,一共12个频率。
根据An Open Dataset for Wearable SSVEP-BasedBrain-ComputerInterfaces,这篇文章对该数据集的描述。
该数据集包括102个MATLAB MAT文件,对应于102个受试者的脑电图数据。所有文件都是根据参与者的索引命名的(即S001.mat、S102.mat)。每个文件都包含一个名为“data”的5-D矩阵,维度为[8,710,2,10,12],并存储为双精度浮点值。五个维度分别表示“通道标号”、“时间点”、“电极标号”、”块标号“和”目标标号“。每个矩阵对应240个历元(12个目标×10个块×2个电极),每个历元由未经任何处理的8个通道的原始脑电图数据组成,长度为2.84s(2.84s×250=710个时间点)
根据连续EEG数据的事件通道中记录的刺激起始点,可以提取数据历元。每个数据历元的长度为2.84s,包括刺激开始前0.5s、视觉反应延迟0.14s、刺激后2s和刺激后0.2s。为了降低存储和计算成本,所有数据都被下采样到250 Hz。
这里因为采样频率为250hz,所以一秒可以采集250个点,所以2.84s采集 2.84 s × 250 = 710 2.84s×250=710 2.84s×250=710 点。 或者这样计算,采样点数 N N N,采样时间 T T T,采样间隔 T s Ts Ts ,采样频率 f s fs fs ,
N = T / T s N = T / Ts N=T/Ts
T s = 1 / f s Ts = 1 / fs Ts=1/fs
所以
N = 2.84 / ( 1 / 250 ) = 2.84 x 250 = 710 点 N= 2.84 / (1/250) = 2.84 x 250 = 710点 N=2.84/(1/250)=2.84x250=710点
我们只使用采集的数据验证下CCA,不需要像文章里,对不同的通道/电极做对比评测。所以只需要拿第二个维度上,710个采集数据点使用即可。在这里用的 x x x 是data_1只取8个通道刺激后2秒的数据,即2~2.84秒,只取最后0.84s的数据,对应210个点。所以 y y y 在公式中的T要用到210个值。 T / S = 210 / 250 = 0.84 T/S = 210/250 = 0.84 T/S=210/250=0.84 这也刚好说明是对应时间长度的。
2.matlab代码
测试代码test_CCA.m如下,根据文中信息,数据 x x x 要使用8个通道的数据。对 y y y 的构建,只使用6个谐波。测试代码配合CCA算法,两个文件配合使用。这里仅读取S001.mat。
test_CCA.m :
%******* test_CCA.m **********%
% 加载.mat文件
load('S001.mat');% 获取data变量部分数据
data_1 = data(:,501:710,1,1,1); % 8x210% t 6x84
t = 1:210; % 定义要用来循环的fre的值
fre_values = [9.25, 11.25, 13.25, 9.75, 11.75, 13.75, 10.25, 12.25, 14.25, 10.75, 12.75, 14.75]; % 可以根据需要添加更多值%% cca
x = data_1'; % 210x8
A_list = zeros([6, 12]); % 初始化存储 A 的多维数组
B_list = zeros([8, 12]); % 初始化存储 B 的多维数组
C1_list = zeros(1, length(fre_values)); % 初始化存储 C1 的单元数组% 循环通过fre_1的值并生成相应的data_2矩阵
for i = 1:length(fre_values)fre = fre_values(i);data_2 = [sin(2*pi*fre*t/250);cos(2*pi*fre*t/250);sin(4*pi*fre*t/250);cos(4*pi*fre*t/250);sin(6*pi*fre*t/250);cos(6*pi*fre*t/250)];y = data_2'; % 210x6[A, B, C1] = CCA(x, y);C1_list(i) = C1;A_list(:, i) = A;B_list(:, i) = B;
end
[max_value, index] = max(C1_list);
P = sqrt(max_value); % 相关系数p等于λ,这里特征值是λ的平方,后面开根号
fprintf('最大相关系数 p = %.5f\n', P); % %.5f 表示保留5位小数
A = A_list(:, index)
B = B_list(:, index)
fprintf('当前注视的图像频率为 %.2f Hz\n', fre_values(index)); % %.2f 表示保留两位小数
CCA算法, CCA.m :
%******** CCA.m *********%
function [A,B,C1]=CCA(X,Y)
%CCA canonical correlation analysis
% [A,B]=cca(X,Y)
dimx=size(X,2); dimy=size(Y,2); %列数(变量数)
Sall = cov([X Y]); %cov求协方差矩阵。原阵X大小为M*N,则cov(X)大小为N*N的矩阵
dim=min(dimx,dimy);
Sxx=Sall(1:dim,1:dim);
Syy=Sall(dim+1:end,dim+1:end);
Sxy=Sall(1:dim,dim+1:end);
Syx=Sall(dim+1:end,1:dim);iSxx=inv(Sxx); %矩阵求逆
iSyy=inv(Syy);M1 = iSxx*Sxy*iSyy*Syx;
M2 = iSyy*Syx*iSxx*Sxy;% 使用 SVD 分解
[U1, S1, V1] = svd(M1); % M1 的奇异值分解
[U2, S2, V2] = svd(M2); % M2 的奇异值分解% 手动单位化 U1 和 U2:使得每列(奇异向量)的模长为 1
for i = 1:size(U1, 2)U1(:, i) = U1(:, i) / sqrt(U1(:, i)' * U1(:, i)); % 每列单位化
endfor i = 1:size(U2, 2)U2(:, i) = U2(:, i) / sqrt(U2(:, i)' * U2(:, i)); % 每列单位化
end% 手动归一化 S1 和 S2,使得最大奇异值为 1
S1 = S1 / max(diag(S1)); % 将 S1 的最大奇异值归一化为 1
S2 = S2 / max(diag(S2)); % 将 S2 的最大奇异值归一化为 1% A ...... 选择最大奇异值对应的奇异向量
[maxVals1, colIndex1] = max(diag(S1)); % 找到最大奇异值所在的列
A = U1(:, colIndex1); % 选择对应的奇异向量
C1 = maxVals1; % 最大奇异值
A = A * diag(1 ./ sqrt(A' * Sxx * A)); % 归一化,注意矩阵的大小匹配% B ...... 选择最大奇异值对应的奇异向量
[maxVals2, colIndex2] = max(diag(S2)); % 找到最大奇异值所在的列
B = U2(:, colIndex2); % 选择对应的奇异向量
B = B * diag(1 ./ sqrt(B' * Syy * B)); % 归一化,注意矩阵的大小匹配
3.运行及结果
将测试代码test_CCA.m和CCA.m文件与数据S001.mat放到同一目录下,方便读取。
运行结果为9.25hz,相关系数和 A , B A,B A,B 具体值,matlab版本不同会有轻微差异。
六、参考文献
CCA学习:
Z. Lin, C. Zhang, W. Wu and X. Gao, “Frequency Recognition Based on Canonical Correlation Analysis for SSVEP-Based BCIs,” in IEEE Transactions on Biomedical Engineering, vol. 53, no. 12, pp. 2610-2614, Dec. 2006, doi: 10.1109/TBME.2006.886577.
数据集来源:
Zhu F, Jiang L, Dong G, Gao X, Wang Y. An Open Dataset for Wearable SSVEP-Based Brain-Computer Interfaces. Sensors (Basel). 2021 Feb 10;21(4):1256. doi: 10.3390/s21041256.
相关文章:
脑电波控制设备:基于典型相关分析(CCA)的脑机接口频率精准解码方法
文章目录 前言一、CCA的用途二、频率求解思路三、输入数据结构四、判断方法五、matlab实践1.数据集获取及处理2.matlab代码3.运行及结果 六、参考文献 前言 在脑机接口(BCI)领域,有SSVEP方向,中文叫做稳态视觉诱发电位,当人观看闪烁的视觉刺激…...
Golang学习笔记_44——命令模式
Golang学习笔记_41——观察者模式 Golang学习笔记_42——迭代器模式 Golang学习笔记_43——责任链模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 事务管理系统2. 多媒体遥控器3. 操作审计系统 四、Go语言实现示例五、高级应用…...
vue项目如何实现条件查询?
目录 1.前端 2.后端 3.mybatis的sql语句 结语 1.前端 说白了就是,无论该参数是否是空字符串,都会传递到后端。(反正不是null就行)。 2.后端 在controller层中,使用RequestParam注解接收名为registerName的参数&…...
windows平台的ffmpeg编译使用
windows平台的ffmpeg编译使用 一、现状 本人使用libgdx开发galGame,发现扩展包gdx-video不支持mp4,不能忍,正好看到官网有支持自定义编译的文档,所以操作一下,自定义编译。本文重点在于操作windows平台,linux平台太简单了。 整个过程包括如下几个步骤。 二、代码下载…...
Android 14 昼夜色切换多屏时候非主屏的Activity无法收到onConfigurationChanged
记录一下遇见的这个问题和查看源码的过程 首先先说遇见的问题 Android 14 昼夜色切换多屏时候 非主屏的Activity 会经常收不到 onConfigurationChanged的回调 分析原因源码中ActivityThread::performActivityConfigurationChanged 里面 private Configuration performActivi…...
NLP常见任务专题介绍(4)-ConditionalGeneration和CasualLM区别
在 transformers 库中,ConditionalGeneration 和 CausalLM 是两种不同类型的语言模型,各自适用于不同的任务: 类别Conditional Generation (条件生成)CausalLM (因果语言模型)核心区别依赖输入 条件 生成文本只能 自回归 生成文本训练方式Encoder-Decoder(编码-解码) 结构…...
【vue+excel】导出excel(目前是可以导出两个sheet)
项目里经常用到的导出ecxel功能是默认导出一个sheet页 现在需要导出两个sheet,一个是总计,另一个是明细 效果如下: 我就在现有的单个导出的功能上改造了一下,只支持导出两个(代码不够灵活,如果需要多个&…...
【数据结构】6栈
0 章节 3.1到3.3小节。 认知与理解栈结构; 列举栈的操作特点。 理解并列举栈的应用案例。 重点 栈的特点与实现; 难点 栈的灵活实现与应用 作业或思考题 完成学习测试2,? 内容达成以下标准(考核…...
【C++】每日一练(有效的括号)
本篇博客给大家带来的是用C语言来解答有效的括号! 🐟🐟文章专栏:每日一练 🚀🚀若有问题评论区下讨论,我会及时回答 ❤❤欢迎大家点赞、收藏、分享! 今日思想:不服输的少年…...
数字化新零售与 AI 大模型,如何重塑大健康赛道?
在数字化浪潮中,大健康赛道正经历深刻变革。数字化新零售营销模式的兴起,与 AI 大模型的强大能力相结合,为大健康领域带来了全新的发展机遇。 数字化新零售营销模式融合线上线下,运用大数据、云计算分析消费者行为,实…...
Android实现Socket通信
问题: 我在Android端对接后端Socket服务实现消息模块的时候,使用WebSocketClient 库,手动构造了订阅和发送消息的 STOMP 帧,,Socket连接成功建立,但是当用户发送消息的时候,对方无法接受到。 …...
✅ Vue 3 响应式写法小抄表(Composition API 实战模板)
📦 引入核心响应式工具 import { ref, reactive, computed, watch, toRefs } from vue1️⃣ 基本类型(string / number / boolean) → 推荐使用 ref() const username ref() const count ref(0) const isLoading ref(false)2️⃣ 对象/表…...
Python数据分析之数据可视化
Python 数据分析重点知识点 本系列不同其他的知识点讲解,力求通过例子让新同学学习用法,帮助老同学快速回忆知识点 可视化系列: Python基础数据分析工具数据处理与分析数据可视化机器学习基础 四、数据可视化 图表类型与选择 根据数据特…...
TCP协议支持全双工原因TCP发送接收数据是生产者消费者模型
一、TCP支持全双工的原因 TCP协议支持全双工,即使用TCP协议进行通信时,服务端和客户端可以同时进行数据的发送和接收,互不干扰,实现同时双向传输数据。 这是因为使用TCP协议通信时,读写套接字的文件描述符既用来发送…...
【ODHead】BEVDet的 CenterHead的推理和拓展到蒸馏损失的算法细节
文章目录 背景常识1、BEVDet的CenterHead整体方案2、蒸馏部分3、输出 preds_dicts 部分3.1、headmap3.2、bbox3.3、Mask掩膜3.4、损失 背景常识 在BEVDet和BEVFormer里,使用了不同的3D detection head(BEVDet用了centerhead,BEVFormer用了de…...
在 CentOS 7 上安装 PHP 7.3
在 CentOS 7 上安装 PHP 7.3 可以按照以下步骤进行操作: 1. 安装必要的依赖和 EPEL 仓库 EPEL(Extra Packages for Enterprise Linux)是为企业级 Linux 提供额外软件包的仓库,yum-utils 用于管理 yum 仓库。 sudo yum install -…...
vue+dhtmlx-gantt 实现甘特图-快速入门【甘特图】
文章目录 一、前言二、使用说明2.1 引入依赖2.2 引入组件2.3 引入dhtmlx-gantt2.4 甘特图数据配置2.5 初始化配置 三、代码示例3.1 Vue2完整示例3.2 Vue3 完整示例 四、效果图 一、前言 dhtmlxGantt 是一款功能强大的甘特图组件,支持 Vue 3 集成。它提供了丰富的功…...
关于ModbusTCP/RTU协议对接Ethernet/IP(CIP)协议的方案
IGT-DSER智能网关模块支持西门子、倍福(BECKHOFF)、罗克韦尔AB,以及三菱、欧姆龙等各种品牌的PLC之间通讯,支持Ethernet/IP(CIP)、Profinet(S7),以及FINS、MC等工业自动化常用协议,同时也支持PLC与Modbus协议的工业机器人、智能仪…...
python-leetcode 49.二叉树中的最大路径和
题目: 二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边,同一个节点在一条路径序列中至多出现一次,该路径至少包含一个节点,且不一定经过根节点。 路径和是路径中各节点值得总和,…...
C语言基础知识04
指针 指针概念 指针保存地址,地址是字节的编号 指针类型和保存的地址类型要一直 使用时注意,把地址转换为&变量的格式来看 int a[3]; a转为&a[0] 指针的大小 64bit 固定8字节, 32bit 固定4字节 指针…...
使用 Golang 操作 MySQL
在Go语言中,操作SQL数据库,通常会用到一些第三方库来简化数据库的连接、查询和操作过程。其中原生的 database/sql go-sql-driver/mysql 库更符合sql语句使用习惯。 安装 go get github.com/go-sql-driver/mysql 直接上代码来演示基本的创建ÿ…...
前端面试:cookie 可以实现不同域共享吗?
在前端开发中,Cookie 不能直接实现不同域之间的共享。Cookie 的作用域受到域的限制,浏览器不会允许一个域下的 Cookie 被另一个域访问。这是为了保护用户隐私及安全,防止跨站请求伪造(CSRF)等安全问题。 Cookie 的基本…...
MyBatis-Plus接入和简单使用
如何接入 https://baomidou.com/getting-started/ 简单使用方法 使用 MyBatis-Plus 时,大多数场景下不需要编写 XML 和 SQL,因为它提供了强大的通用 CRUD 操作和条件构造器。但以下情况可能需要手动编写 SQL: 1. 不需要写 XML/SQL 的场景 …...
【Go万字洗髓经】Golang内存模型与内存分配管理
本文目录 1. 操作系统中的虚拟内存分页与进程管理虚拟内存与内存隔离 2. Golang中的内存模型内存分配流程内存单元mspan线程缓存mcache中心缓存mcentral全局堆缓存mheapheapArena空闲页索引pageAlloc 3. Go对象分配mallocgc函数tiny对象分配内存 4.结合GMP模型来看内存模型tiny…...
mov格式视频如何转换mp4?
mov格式视频如何转换mp4?在日常的视频处理中,经常需要将MOV格式的视频转换为MP4格式,以兼容更多的播放设备和平台。下面给大家分享如何将MOV视频转换为MP4,4款视频格式转换工具分享。 一、牛学长转码大师 牛学长转码大师是一款功…...
鸿蒙OS开发ForEach循环渲染
摘要 在ForEach循环渲染过程中,如果修改列表项中的数据,但是UI页面不会刷新。在最近开发公司app时遇到了这个问题,经过查看官方文档找到了解决方式 官方地址:数据变化不刷新 一、具体解决方案 思路:通过父子组件传…...
【算法】DFS、BFS、拓扑排序
⭐️个人主页:小羊 ⭐️所属专栏:算法 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 持续更新中...1、DFS2、BFSN 叉树的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度 3、多源BFS腐烂的苹果 4、拓扑排序 持续更新中…...
【Godot4.0】贝塞尔曲线在游戏中的实际应用
概述 之前研究贝塞尔曲线绘制,完全是以绘图函数,以及实现节点连接为思考。并没有实际考虑贝塞尔曲线在游戏中的应用。今日偶然看到悦千简一年多前发的一个用贝塞尔曲线实现追踪弹或箭矢效果,还有玩物不丧志的老李杀戮尖塔系列中的卡牌动态箭…...
MongoDB 数据导出与导入实战指南(附完整命令)
1. 场景说明 在 MongoDB 运维中,数据备份与恢复是核心操作。本文使用 mongodump 和 mongorestore 工具,演示如何通过命令行导出和导入数据,解决副本集连接、路径指定等关键问题。 2. 数据导出(mongodump) 2.1 导出命…...
『Rust』Rust运行环境搭建
文章目录 rust编译工具rustupVisual Studio VS Code测试编译手动编译VSCode编译配置 参考完 rust编译工具rustup https://www.rust-lang.org/zh-CN/tools/install 换源 RUSTUP_DIST_SERVER https://rsproxy.cn RUSTUP_UPDATE_ROOT https://rsproxy.cn修改rustup和cargo的安…...
CPU+GPU结合的主板设计思路与应用探讨
在高性能计算和图形处理需求不断增长的背景下,CPUGPU结合的主板设计逐渐成为硬件架构的重要趋势。本文将探讨基于CPUGPU架构的主板设计思路、关键技术考量以及应用前景。 1. 设计思路概述 CPU(中央处理器)擅长处理复杂的逻辑运算和多任务控制…...
latex问题汇总
latex问题汇总 环境问题1 环境 texlive2024 TeXstudio 4.8.6 (git 4.8.6) 问题1 编译过程有如下错 ! Misplaced alignment tab character &. l.173 International Conference on Infrared &Millimeter Waves, 2004: 667--... I cant figure out why you would wa…...
学习springboot-Bean管理(Bean 注册,Bean 扫描)
Bean 扫描 可以浏览下面的博客链接 :spring 学习 (注解)-CSDN博客 在学习spring 注解时,我们使用 Component ,Service,Controller等 这样的注解,将目标类信息,传递给IOC容器,为其创…...
iOS开发,SQLite.swift, Missing argument label ‘value:‘ in call问题
Xcode16中,集成使用SQLite.swift,创建表的时候: let id Expression<Int64>("id"),报错Missing argument label value: in call 直接使用SQLite.Expression<Int64>("id") 或者定义一个全局typ…...
【GIT】重新初始化远程仓库
有的时候我们克隆远端仓库会出错: git clone --depth 1 git116.*.*.*:/srv/customs.git D:\dev\projects\kdy\customs11\customs Cloning into D:\dev\projects\kdy\customs11\customs... remote: Enumerating objects: 1494, done. remote: Counting objects: 100…...
Vue3中 ref 与 reactive区别
ref 用途: ref 通常用于创建一个响应式的基本类型数据(如 string、number、boolean 等),但它也可以用于对象或数组 返回值: ref 返回一个带有 .value 属性的对象,访问或修改数据需要通过 .value 进行 使用场景: …...
apollo3录音到wav播放解决方法
SDK DEMO项目:ap3bp_evb_vos_pcm_recorder_20210901 pcm_recorder.c //***************************************************************************** // // Options // //***************************************************************************** #define PRINT…...
信号处理抽取多项滤波的数学推导与仿真
昨天的《信号处理之插值、抽取与多项滤波》,已经介绍了插值抽取的多项滤率,今天详细介绍多项滤波的数学推导,并附上实战仿真代码。 一、数学变换推导 1. 多相分解的核心思想 将FIR滤波器的系数 h ( n ) h(n) h(n)按相位分组,每…...
Java网络多线程
网络相关概念: 关于访问: IP端口 因为一个主机上可能有多个服务, 一个服务监听一个端口,当你访问的时候主机通过端口号就能知道要和哪个端口发生通讯.因此一个主机上不能有两个及以上的服务监听同一个端口. 协议简单来说就是数据的组织形式 好像是两个人交流一样,要保证自己说…...
linux centos 忘记root密码拯救
在CentOS 7中,如果忘记root密码,可以通过修改系统启动参数进入单用户模式或紧急模式进行重置。以下是两种常用方法,适用于物理机或虚拟机环境: 方法一:通过rd.break参数重置密码 步骤: 重启系统并进入GRU…...
C# 事件使用详解
总目录 前言 在C#中,事件(Events)是一种基于委托的重要机制,用于实现对象之间的松耦合通信。它通过发布-订阅模式(Publisher-Subscriber Pattern),允许一个对象(发布者)…...
flink cdc同步mysql数据
一、api 添加依赖 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-mysql-cdc</artifactId><!-- 请使用已发布的版本依赖,snapshot 版本的依赖需要本地自行编译。 --><version>3.3-SNAP…...
tomcat负载均衡配置
这里拿Nginx和之前做的Tomcat 多实例来实现tomcat负载均衡 1.准备多实例与nginx tomcat单机多实例部署-CSDN博客 2.配置nginx做负载均衡 upstream tomcat{ server 192.168.60.11:8081; server 192.168.60.11:8082; server 192.168.60.11:8083; } ser…...
Ceph(1):分布式存储技术简介
1 分布式存储技术简介 1.1 分布式存储系统的特性 (1)可扩展 分布式存储系统可以扩展到几百台甚至几千台的集群规模,而且随着集群规模的增长,系统整体性能表现为线性增长。分布式存储的水平扩展有以下几个特性: 节点…...
16、JavaEE核心技术-EL与 JSTL
EL与 JSTL 实践 一. EL(Expression Language) EL(表达式语言)是 JSP 2.0 中引入的一种简单的脚本语言,用于在 JSP 页面中简化数据的访问和显示。它通过一种类似于 JavaScript 的语法,允许开发者在 JSP 页面…...
RabbitMQ报错:Shutdown Signal channel error; protocol method
报错信息: Shutdown Signal: channel error; protocol method: #method<channel.close>(reply-code406, reply-textPRECONDITION_FAILED - unknown delivery tag 1, class-id60, method-id80) 原因 默认情况下 RabbitMQ 是自动ACK(确认签收&…...
使用DeepSeek完成一个简单嵌入式开发
开启DeepSeek对话 请帮我使用Altium Designer设计原理图、PCB,使用keil完成代码编写;要求:使用stm32F103RCT6为主控芯片,控制3个流水灯的原理图 这里需要注意,每次DeepSeek的回答都不太一样。 DeepSeek回答 以下是使…...
NLP技术介绍
NLP技术介绍 语言分析技术分词词性标注命令实体识别句法分析语义分析文本处理技术文本分类文本聚类情感分析文本生成机器翻译对话系统与交互技术聊天机器人问答系统语音识别与合成知识图谱与语义理解技术知识图谱语义搜索语义推理深度学习与预训练模型循环神经网络(RNN)及其变…...
pycharm + anaconda + yolo11(ultralytics) 的视频流实时检测,保存推流简单实现
目录 背景pycharm安装配置代码实现创建本地视频配置 和 推流配置视频帧的处理和检测框绘制主要流程遇到的一些问题 背景 首先这个基于完整安装配置了anaconda和yolo11的环境,如果需要配置开始的话,先看下专栏里另一个文章。 这次的目的是实现拉取视频流…...
C++编译问题——1模板函数的实现必须在头文件中
今天编译数据结构时,遇见一个编译错误 假设你有一个头文件 SeqList.h 和一个源文件 SeqList.cpp。 SeqList.h #ifndef SEQLIST_H #define SEQLIST_H#include <stdexcept> #include <iostream>template<typename T> class SeqList { private:sta…...