LeetCode 190. 颠倒二进制位
【LeetCode】 190. 颠倒二进制位
算法
以 8 比特为例,abcdefgh,每次运算交换“奇偶位”,即 [badcfehg] → [dcbahgfe] → hgfedcba
123456789101112131415161718class Solution {public: unsigned reverseBits(unsigned n) const { n = n >> 1 & M1 | (n & M1) << 1; n = n >> 2 & M2 | (n & M2) << 2; n = n >> 4 & M4 | (n & M4) << 4; n = n >> 8 & M8 | (n & M8) << 8; // n = n >> 16 & M16 | (n & M16) < ...
频偏对相关峰高度的影响
频偏对相关峰高度的影响
在接收机的捕获模块中,以相关峰高度作为捕获性能的衡量指标,当接收信号的相位与本地码相位对齐时,相关运算的结果会出现较大的相关峰,但如果存在频偏,会导致相关峰高度下降。下面推导相关峰高度与频偏的关系:
设捕获模块的输入信号的一个符号为 ,它被扩展为 个码片,忽略随机时延,即与本地 PN 码相位对齐时,时域表达式为
式中, 表示本地参考信号, 表示离散的加性高斯白噪声, 表示频偏, 表示采样周期。
捕获的输入信号与本地参考信号的相关结果为
忽略噪声项
,带入上式中得
当 远小于采样率 时, 近似为
当 时,峰值位置 ,零点位置对应
由此可以得出,相关峰随频偏的变化满足 函数,并且当频偏为 的整数倍时,相关峰高度为 ,MATLAB 仿真结果如图所示
在捕获模块频偏搜索的精度选择上,如果以 为步进设置频偏通道,在 的奇数倍时相关峰高度最低,为无频偏位置的 ,性能损失较大,如果以 为步进设置频偏通道,在 的奇数倍时相关峰高度最低,为无频偏位置的 ,性能损失较低,因此,综合捕获性能与资源消耗的考量, ...
FPGA虚拟双口RAM
FPGA 虚拟双口 RAM
给一段波形加发送时延,可以将其存储到 BRAM IP 核中,读地址比写地址晚响应的延迟采样点数(BRAM 深度足够,即大于延迟采样点数),就达到了延迟的效果。对于常有效的信号波形来说这么做是可以的。但是对于只有在某几个时刻有效的信号来说,仍采用这种办法缓存,BRAM 中存储的大多数数据是无效的,浪费了很多 BRAM 资源。
本文采用的办法是“虚拟”的 RAM,读地址与写地址的关系不变,虚拟的写地址始终累加,虚拟的读地址延迟相应的采样点数。但是数据不写入 RAM 中,而是在数据有效时写入一个寄存器,并且标记对应的虚拟写地址为真实的读地址,当虚拟的读地址为真实读地址时从寄存器中读出数据。(testbench 见附录)
如下图所示,数据 data 只有当 valid 拉高时有效,于是按照上述逻辑对 data 和 valid 信号延迟,当 ...dout_valid 拉高时表示数据延迟了 \(100\) 个采样点。
特别感谢罗老师的耐心细致的讲解!
附录
123456789101112131415161718192021222324252 ...
缓存系统
缓存系统
最久未使用缓存机制
最久未使用(Least Recently Used, LRU)缓存机制,将最近最少使用的内容替换掉。
146. LRU 缓存
利用 哈希表 和 双向链表 实现 LRU 缓存机制,使查找、添加和删除都是 的操作。
待缓存的内容以键值对 key-value 的形式存在,哈希表存储了已经存在于缓存区的内容的 key。双向链表的节点按照访问时间排序,越靠近尾部,越久没有被访问。
读取缓存时,只需要在哈希表中查找是否存在 key,存在则返回对应的 value,同时,这是最新访问的 key-value,就把它移动到链表头部,如果不存在,就将其直接插入到链表头部。
更新缓存时,直接将 key-value 更新到链表头部即可,如果超出缓存区容量,将尾部节点删除。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273#includ ...
SpringBoot环境配置
SpringBoot 环境配置
Windows
操作系统:Windows 11 Pro 24H2
安装包路径
Java(TM)SE Development Kit 24.0.1(64-bit)
IntelliJ IDEA Community Ultimate 2025.1.3
Apache Maven 3.9.10(下载 .zip 文件并解压)
添加环境变量
新建 系统变量:
变量名为 JAVA_HOME,变量值为 C:\Software\Java\jdk-24
变量名为 MAVEN_HOME,变量值为 C:\Software\Java\Maven
系统变量 Path 中添加 C:\Software\Java\jdk-24\bin 和 C:\Software\Java\Maven\bin
添加完成后打开 PowerShell,执行 java --version,显示如下
12345❯ java --versionPicked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8java 24.0 ...
经过射频上变频后IQ为什么反了?
经过射频上变频后 IQ 为什么反了?
数学原理
设数字域信号为 ,经过中频上变频,DAC 发射信号为
频域表示为
经过射频的上变频,最终发射信号表示为
仿真(MATLAB)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495close all; clear; clc;%% System Parametersfs = 24.576e3; % 24.576MHzfc = 10; % 10kHzf_if = 50; % 50kHzf_rf1 = 450; % 450kHzf_rf2 = 550; % 550kHzN = 2 ^ 20;t = 0: 1/fs : 500; ...
LeetCode 169. 多数元素
【LeetCode】 169. 多数元素
哈希表
算法
用哈希表存储每个元素以及其出现的次数。
123456789101112131415161718class Solution {public: int majorityElement(vector<int>& nums) { int res = 0; int cnt = 0; for (const auto & num : nums) { ++mp[num]; if (mp[num] > cnt) { res = num; cnt = mp[num]; } } return res; }private: unordered_map<int, int> mp;};
复杂度分析
时间复杂度:,遍历数组 nums 一次,插入哈希表需要常数时间;
空间复杂度:,题目中 ...
判圈法
判圈法
Floyd 判圈法
Floyd 判圈法
利用快慢指针,快指针步进速度为慢指针的两倍,若是链表中存在环,则两个指针一定会相遇,且快指针路程比慢指针路程多圈长度的整数倍。
假设两个指针在 点相遇,则有
快指针:
慢指针:
【LeetCode】141. 环形链表
12345678910111213141516171819202122class Solution {public: static bool hasCycle(ListNode *head) { if (head == nullptr || head->next == nullptr) { return false; } ListNode *low = head; ListNode *fast = head->next; while (fast != nullptr) { if (fast == low) { return true; ...
多相滤波器
多相滤波器
多相滤波器常用语多速率数字信号处理系统。
假设要对输入数据序列进行 倍下采样,为了避免频谱展宽导致的混叠,首先要进行抗混叠滤波,然后对滤波结果进行下采样,显然,滤波输出中每 个数据就有 个数据会被丢弃,也就是说,针对这 个数据的滤波处理是浪费的,多相滤波器就是为了解决这一计算浪费问题而设计的。
假设要对输入数据进行 倍上采样,在上采样之后,需要进行滤波处理以消除镜像,一般做法是先进行插零上采样,然后进行滤波。采用多相滤波器可以颠倒采样和滤波的顺序以降低运算量。
诺贝尔恒等变换
在对滤波器进行适当变形分解后,可以交换上/下采样处理和滤波处理的顺序,并且保证处理结果一致。
多相分解
Ⅰ 型多相分解
设输入信号为 ,滤波器冲激响应为 ,先进性抗混叠滤波再进行下采样处理,过程如下
数字滤波器 ,定义 ,称 为 的第 个分组,
令 ,则
若 ,则称 为 的第 个多相分量,
将 均分为 组,除 余 的分在一组,e.g.
已知 阶数字滤波器单位脉冲响应为 ,求 时的多相分解
Ⅱ 型多相分 ...
同步有限状态机
同步有限状态机
同步有限状态机(Finit State Machine, FSM)用于 FPGA 处理具有时间上先后顺序的事件。同步 指的是所有状态转移都在时钟作用下进行,有限 指的是状态有限。
分类
Mealy 型状态机:输出取决于当前状态与输入;
Moore 型状态机:输出取决于当前状态,与输入无关;
写法
一段式状态机:一个 always 模块中既描述状态转移,又描述输入和输出;不推荐
二段式状态机:两个 always 模块,一个用同步时序逻辑描述状态转移,另一个用组合逻辑判断转移条件和输出。定义两个状态(现态和次态);组合逻辑容易产生毛刺,不利于约束,不推荐
三段式状态机:三个 always 模块,一个用同步时序逻辑描述状态转移,一个用组合逻辑判断转移条件,一个用时序逻辑描述状态输出;
123456789101112131415161718192021222324252627282930313233343536373839404142// 1. state 去哪里(时序逻辑)always @(posedge clk) begin if(! ...