从零开始利用MATLAB进行FPGA设计(一):建立脉冲检测模型的Simulink模型1

news2025/2/22 19:48:18

文章灵感来源于MATLAB官方免费教程:HDL Coder Self-Guided Tutorial

考虑到MATLAB官网的英文看着慢,再加上视频讲解老印浓浓的咖喱味,我决定记录利用MATLAB&Simulink&SystemGenerator进行FPGA数字信号处理的学习过程。

在进行数字信号处理的算法验证阶段,主要是通过MATLAB进行算法设计,然后用Simulink模块化进行算法验证。

1.MATLAB参考算法

1.1创建输入模拟

% Setup
clear; clc; close all;
% Create pulse to detect
rng('default');
PulseLen = 64;
theta = rand(PulseLen,1);
pulse = exp(1i*2*pi*theta);
% Insert pulse to Tx signal
rng('shuffle');
TxLen = 5000;
PulseLoc = randi(TxLen-PulseLen*2);
TxSignal = zeros(TxLen,1);
TxSignal(PulseLoc:PulseLoc+PulseLen-1) = pulse;
% Create Rx signal by adding noise
Noise = complex(randn(TxLen,1),randn(TxLen,1));
RxSignal = TxSignal + Noise;
% Scale Rx signal to +/- one
scale1 = max([abs(real(RxSignal)); abs(imag(RxSignal))]);
RxSignal = RxSignal/scale1;

这段代码主要执行了以下操作:

  1. 清空 MATLAB 工作区,关闭所有图形窗口,清空命令窗口。
  2. 创建一个长度为 64 的脉冲信号(pulse),信号的相位由随机生成的角度(theta)决定。
  3. 在长度为 5000 的 Tx 信号中随机选择一个位置,并将上面创建的脉冲信号插入到该位置。
  4. 为 Rx 信号添加了复数形式的高斯白噪声(Noise)。
  5. 将 Rx 信号进行归一化,使其最大幅度为 1。

代码创建完毕后生成的RxSignal即是需要进行滤波处理的信号。

1.2通过滤波算法进行滤波(黄金准则)

% Create matched filter coefficients
CorrFilter = conj(flip(pulse))/PulseLen;
% Correlate Rx signal against matched filter
FilterOut = filter(CorrFilter,1,RxSignal);
% Find peak magnitude & location
[peak, location] = max(abs(FilterOut));
% Print results
figure(1)
subplot(311); plot(real(TxSignal)); title('Tx Signal (real)');
subplot(312); plot(real(RxSignal)); title('Rx Signal (real)');
t = 1:length(FilterOut);
str = sprintf('Peak found at %d with a value of %.3d',location,peak);
subplot(313); plot(t,abs(FilterOut),location,peak,'o'); title(str);

这段代码主要执行了以下操作:

  1. 创建匹配滤波器系数:创建一个与脉冲信号(pulse)匹配的滤波器。匹配滤波器在接收端用于检测信号中的特定序列或模式。CorrFilter 是通过对脉冲信号取共轭并翻转后除以长度(PulseLen)得到的。

  2. 函数对 Rx 信号和匹配滤波器进行相关运算,以检测信号中的脉冲。FilterOut 存储了相关运算的结果。

  3. 查找峰值幅度和位置:使用 max 函数找到 FilterOut 中的峰值及其位置。peak 存储了找到的峰值的幅度,location 存储了其位置。

  4. 打印结果:创建一个包含三个子图的图形窗口,分别显示 Tx 信号的实部、Rx 信号的实部以及滤波器输出的幅度。在第三个子图中,将峰值和其位置用圆圈标出,并在标题中显示峰值的位置和幅度。

1.3硬件友好的峰值查找算法

WindowLen = 11;
MidIdx = ceil(WindowLen/2);
threshold = 0.03;
% Compute magnitude squared to avoid sqrt operation
MagSqOut = abs(FilterOut).^2;
% Sliding window operation
for n = 1:length(FilterOut)-WindowLen

    % Compare each value in the window to the middle sample via subtraction
    DataBuff = MagSqOut(n:n+WindowLen-1);
    MidSample = DataBuff(MidIdx);
    CompareOut = DataBuff - MidSample; % this is a vector

    % if all values in the result are negative and the middle sample is
    % greater than a threshold, it is a local max
    if all(CompareOut <= 0) && (MidSample > threshold)
        peak_2 = MidSample;
        location_2 = n + (MidIdx-1);
    end
end

这段代码主要执行了以下操作:

  1. 设置窗口长度为 11:这个窗口长度用于滑动窗口操作,以便对滤波器输出进行局部最大值的检测。

  2. 计算窗口的中间索引:用于找到窗口中间的样本位置。

  3. 设置阈值为 0.03:该阈值用于判断窗口中间的样本是否为局部最大值。

    在滤波器输出中,可能存在一些噪声或干扰,导致局部最大值的检测不够准确。通过设置阈值,可以过滤掉那些相对较小的局部峰值,只保留那些显著的峰值,从而提高检测的准确性。

    换句话说,阈值充当了一个过滤器,确保只有满足一定幅度要求的峰值才被认为是有效的局部最大值。

  4. 对滤波器输出的幅度进行平方,以避免每次比较时都需要进行开方操作,提高运算效率。

  5. 通过一个 for 循环,对滤波器输出进行滑动窗口操作,以便检测局部最大值。

  6. 将窗口中的每个值与中间样本进行比较:将窗口中的数据与中间样本相减,用于判断是否为局部最大值。

  7.  如果结果中的所有值都为负且中间样本大于阈值,则中间样本为局部最大值

在运行MATLAB参考算法之后生成的工作区包含需要进行处理的信号等各个参量。

同时还会生成脉冲信号的实部,添加了噪声的脉冲信号实部以及滤波器的输出信号:

2.匹配滤波器

在MATLAB滤波算法中,关键算法匹配滤波器上。在 MATLAB 中,filter 函数用于对输入信号进行滤波操作。它可以应用各种数字滤波器,包括移动平均滤波器、低通滤波器、高通滤波器等。

y = filter(b, a, x)

其中:

  • b 是滤波器的分子系数(也称为 FIR 滤波器的系数)。
  • a 是滤波器的分母系数(也称为 IIR 滤波器的系数),如果省略,则默认为 1,表示使用的是 FIR 滤波器。
  • x 是输入信号。

函数返回滤波后的输出信号 y

filter 函数通过对输入信号 x 与滤波器的系数 ba 进行卷积操作来计算输出信号。具体来说,对于 FIR 滤波器,输出信号的每个样本都是输入信号在滤波器的系数上的加权和。

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

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

相关文章

vue学习笔记24-组件事件配合v-model使用

搜索时v-model绑定的search数据时时发生变化 watch侦听器时时监察变化&#xff0c;一旦数据发生变化 &#xff0c;就实时发送数据给父组件 子组件的完整代码&#xff1a; <template>搜索&#xff1a;<input type"text" v-model"search"> <…

如何把网站的http改成https?

想把网站从不安全的HTTP换成安全的HTTPS&#xff1f;来瞧瞧下面几步操作&#xff1a; 1.挑个SSL证书&#xff1a; - 根据你的网站情况&#xff08;比如就一个域名、多个域名还是啥域名都得管&#xff09;&#xff0c;找一款适合的SSL证书&#xff0c;有免费的DV&#xff08;验…

k8s-Istio服务网络 27

官网&#xff1a;https://istio.io/latest/zh/about/service-mesh/ Istio与k8s的区别 SpringCloud传统微服务结合k8s与Istio与k8s结合&#xff1a; Istio数据面&#xff1a;通过envoy以sidecar方式拦截svc的流量来进行治理。 Istio控制面&#xff1a;pilot list/watch APIserv…

【WSN覆盖优化】基于改进黏菌算法的无线传感器网络覆盖 WSN覆盖优化【Matlab代码#65】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 改进SMA算法1.1 改进参数p1.2 混沌精英突变策略 2. WSN节点感知模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取…

TypeScript(五)交叉类型,联合类型,映射类型

交叉类型 交叉类型是将多个类型合并为一个类型。可以把现有的多种类型叠加到一起成为一种类型&#xff0c;它包含了所需的所有类型的特性。使用符号 & 表示。交叉类型 A & B 表示&#xff0c;任何一个新类型必须同时属于 A 和 B&#xff0c;才属于交叉类型 A & B …

数据库基础知识超详细解析~‍(进阶/复习版)

文章目录 前言一、数据库的操作1.登入数据库2.创建数据库3.显示当前数据库4.使用数据库5.删除数据库 二、常用数据类型三、数据库的约束1约束类型2NULL约束3UNIQUE:唯一约束4DEFAULT&#xff1a;默认值约束5 PRIMARY KEY&#xff1a;主键约束6 FOREIGN KEY&#xff1a;外键约束…

MyBatis-Plus学习记录

目录 MyBatis-Plus快速入门 简介 快速入门 MyBatis-Plus核心功能 基于Mapper接口 CRUD 对比mybatis和mybatis-plus&#xff1a; CRUD方法介绍&#xff1a; 基于Service接口 CRUD 对比Mapper接口CRUD区别&#xff1a; 为什么要加强service层&#xff1a; 使用方式 CR…

【CSS颜色】

本文章属于学习笔记&#xff0c;在https://www.freecodecamp.org/chinese/learn/2022/responsive-web-design/中练习 三、CSS颜色 1、有两种主要的颜色模型:电子设备中使用的加性RGB(红、绿、蓝)模型和印刷品中使用的减色CMYK(青色、品红、黄色、黑色)模型。 使用RGB模型。这…

Ypay源支付6.9无授权聚合免签系统可运营源码

YPay是一款专为个人站长设计的聚合免签系统&#xff0c;YPay基于高性能的ThinkPHP 6.1.2 Layui PearAdmin架构&#xff0c;提供了实时监控和管理的功能&#xff0c;让您随时随地掌握系统运营情况。 说明 Ypay源支付6.9无授权聚合免签系统可运营源码 已搭建测试无加密版本…

FastWiki v0.1.0发布!新增超多功能

FastWiki 发布 v0.1.0 https://github.com/239573049/fast-wiki/releases/tag/v0.1.0 更新日志 兼容OpenAI接口格式删除Blazor版本UI删除useEffect,解决可能存在问题的bug修复对话可以看到所有对话Merge branch ‘master’ of https://gitee.com/hejiale010426/fast-wiki更新…

14、设计模式之命令模式(Command)

一、什么是命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;又叫动作模式或事务模式。它将请求&#xff08;命令&#xff09;封装成对象&#xff0c;使得可以用不同的请求对客户端进行参数化&#xff0c;具体的请求可以在运行时更改…

蓝桥杯-粘木棍-DFS

题目 思路 --有n根木棍&#xff0c;需要将其粘成m根木棍&#xff0c;并求出最小差值&#xff0c;可以用DFS枚举出所有情况。粘之前有n根短木棍&#xff0c;粘之后有m根长木棍&#xff0c;那么让长木棍的初始长度设为0。外循环让所有的短木棍都参与粘&#xff0c;内循环让要粘的…

基于SpringBoot的“企业客户信息反馈平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“企业客户信息反馈平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 平台首页界面图 技术文档界面图 问题信息…

C# Onnx C2PNet 图像去雾 室外场景

目录 介绍 效果 模型信息 项目 代码 下载 C# Onnx C2PNet 图像去雾 室外场景 介绍 github地址&#xff1a;https://github.com/YuZheng9/C2PNet [CVPR 2023] Curricular Contrastive Regularization for Physics-aware Single Image Dehazing 效果 模型信息 Model P…

专升本 C语言笔记-03 变量的作用域

1.变量的概念 内存中有个存储区域,这个地方的数据可以在同一类型范围内不断变化通过变量名,可以访问这块内存区域,获取里面的值; 变量名的构成:数据类型 变量名 值 C语言中变量声明格式: 数据类型 变量名 值 2.变量的注意 2.1.全局变量: 定义在函数外部的叫全局变量…

SD-WAN技术如何保障网络的持续连接和稳定性

在当今数字化时代&#xff0c;企业对于网络的稳定性和持续连接性需求日益增加。SD-WAN作为一种新兴的网络解决方案&#xff0c;为企业提供了有效的方式来实现网络的持续连接和稳定性。本文将探讨SD-WAN技术如何保障网络的持续连接和稳定性。 1、多路径冗余技术 SD-WAN采用了多…

一台服务器部署两个独立的mysql实例

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

激活函数Mish

paper&#xff1a;Mish: A Self Regularized Non-Monotonic Activation Function official implementation&#xff1a;https://github.com/digantamisra98/Mish 背景 在早期文献中&#xff0c;Sigmoid和TanH激活函数被广泛使用&#xff0c;随后在深度神经网络中失效。相比于…

大宗电子盘商品撮合制交易软件PHP后台

大宗电子盘商品撮合制交易软件是一种用于大宗商品电子交易的系统&#xff0c;其中撮合制是交易机制的核心部分&#xff0c;它负责将买卖双方的订单进行匹配并完成交易。在开发这类软件的PHP后台时&#xff0c;需要考虑以下几个关键方面&#xff1a; 系统架构设计&#xff1a; …

Docker拉取镜像存储不足

在使用Docker时&#xff0c;我们经常遇到一个问题&#xff0c;就是拉取镜像时提示存储空间不足。这是因为Docker在拉取镜像时需要将镜像文件下载到本地存储中&#xff0c;而有时本地存储空间不足以容纳完整的镜像文件。 本文将介绍一些解决这个问题的方法&#xff0c;并提供相…