判圈法
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; } ...
多相滤波器
抽取与抗混叠 FIR 滤波器
抽取的作用是仅保留每 M 个样本中的 1 个样本,从而降低采样率。
如果要从 抽取到 ,首先需要经过一个低通滤波器,滤除所有高于
的信号,从而满足
Nyquist 采样定理。
MATLAB 仿真程序如下(代码由 Claude Sonnet 4.5 生成)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541 ...
同步有限状态机
同步有限状态机(Finit State Machine, FSM)用于 FPGA
处理具有时间上先后顺序的事件。同步
指的是所有状态转移都在时钟作用下进行,有限
指的是状态有限。
分类
Mealy
型状态机:输出取决于当前状态与输入;
Moore
型状态机:输出取决于当前状态,与输入无关;
写法
一段式状态机:一个 always
模块中既描述状态转移,又描述输入和输出;不推荐
二段式状态机:两个 always
模块,一个用同步时序逻辑描述状态转移,另一个用组合逻辑判断转移条件和输出。定义两个状态(现态和次态);组合逻辑容易产生毛刺,不利于约束,不推荐
三段式状态机:三个 always
模块,一个用同步时序逻辑描述状态转移,一个用组合逻辑判断转移条件,一个用时序逻辑描述状态输出;
123456789101112131415161718192021222324252627282930313233343536373839404142// 1. state 去哪里(时序逻辑)always @(posedge clk) begin if(!rst_n) begin s ...
多线程编程
C 语言中使用 pthread 库进行多线程编程。
创建线程
pthread_t 用于声明线程 ID;
1234567/* Create a new thread, starting with execution of START-ROUTINE getting passed ARG. Creation attributed come from ATTR. The new handle is stored in *NEWTHREAD. */extern int pthread_create (pthread_t *__restrict __newthread, const pthread_attr_t *__restrict __attr, void *(*__start_routine) (void *), void *__restrict __arg) __THROWNL __nonnull ((1, 3));
pthread_create 函数使用线程 ID
创建一个线程,包含四个参数:线程
ID、线程属性、函数指针、参数指针 ...
信号边沿检测
测试程序见 Euler0525@Wiki/programming/verilog/#信号边沿检测
名称
I/O
说明
clk
I
时钟信号
rst_n
I
(同步)复位
edge_pin
I
待检测信号
edge_neg
O
边沿
测试程序中的 edge_pin
为待检测边沿的信号,edge_d0 和 edge_d1
分别为延迟信号。
123456789always@(posedge clk) begin if(rst_n == 1'b0) begin edge_d0 <= 1'b1; edge_d1 <= 1'b1; end else begin edge_d0 <= edge_pin; edge_d1 <= edge_d0; endend
为了检测 edge_pin
的边沿,我暂时可以想到以下几种方法(经测试后仅部分可行)
时序逻辑
123456789101112131415always @(posedge clk ) begin if(r ...
噪声建模
SNR 与 Eb/n0 的关系
本文用到的符号表示:
:比特能量,单位
:噪声的功率谱密度,单位
:无量纲
:信号功率,单位
:噪声功率,单位
带宽
:信噪比,无量纲
:比特速率,单位 ;:传输每比特所需的时间
:符号速率,单位
:码片速率,单位
:调制星座点个数
:扩频比
:根升余弦成型滤波器的滚降因子
:内插系数
SNR(Signal Noise Radio)表示信噪比, 表示传输
信息所需要的能量与噪声功率谱密度的比值。对于数字信号来说,用时间长度为
的波形表示码元,每个码元的平均功率为 ,因此不能用功率描述数字信号,因此采用码元能量来描述数字信号波形。
其中带宽 ,比特能量与符号能量满足关系 ,则
最终得到,
注:
在常规通信系统中,
是仿真中的采样速率与 符号速率 之比;
在扩频通信系统中,
是仿真中的采样速率与 码片速率 之比;
参考资料
What are
SNR and Eb/No?
GEL7014 -
Week 6e - EBN0 vs SNR
离散傅里叶变换
预备知识
傅里叶级数
傅里叶变换是 以时间
为自变量的时域信号 和 以频率 为自变量的频域函数
之间的变换关系。
对于周期为 的连续时间信号
,其频谱 是离散非周期函数
其中
为离散频谱两谱线间的角频率间隔,
为谐波序号。
对于连续的非周期时间信号 ,其频谱
是一个连续的非周期函数。满足
对于离散非周期信号,其频谱 是连续周期信号
其中 是数字角频率,满足
。
可以看出,时间域的周期造成频谱的离散,时间域的非周期造成频谱的连续。
不过,上面的三种傅里叶变换总有一个域是连续的,这不能利用计算机辅助计算。
周期序列的离散傅里叶级数(DFS)
离散非周期信号的频谱是连续的,将连续的傅里叶变换
点采样后,频域离散,时域周期延拓。因此,离散傅里叶级数对周期序列才存在。
设 是周期为 的一个离散周期序列
由离散时间傅里叶变换(DTFT)可知,该周期序列可以表示为
其中
是离散傅里叶级数的系数,
并且
也是周期序列。因此,时域的离散周期序列的离散傅里叶级数(DFS)在频域也是离散的周期序列。
令 ,离散傅里叶级数可表示为
连续周期信号与离散周期序列的对 ...
m序列
原理
m 序列长度为 ,具有强自相关性和低互相关性,具体体现为对极化之后相关运算的峰均比。
m 序列由线性反馈移位寄存器(Linear Feedback Shift
Register,LFSR)生成,,取决于 LFSR
的阶数和生成种子(寄存器初始状态)。
阶数
例如阶数为 时,本原多项式
为 ,则多项式共有 位,对应 LSFR 有 个寄存器,
阶数为 6 的 LFSR
生成种子
生成种子不能为全 ,否则输出永远是 .
MATLAB 仿真
12345678910111213141516function [pn] = mseq(coe) len = 2 ^ (length(coe) - 1)-1; pn = zeros(1, len); lfsr = randi([0 1], 1, (length(coe) - 1)); % lfsr = [zeros(1, length(coe) - 2) 1]; for i = 1: len pn(i) = lfsr(end); lfsr_front = 0; ...
超外差结构的干扰
图 1 超外差发射机模型图
镜频干扰
首先只考虑发送 路的情况,
其中 为本振频率, 为中频,信号频率 ,在频谱仪上观察射频信号的频谱图,会发现关于 对称的两个频率分量,如下图所示
图 2 镜频干扰与交调干扰的现象
镜像现象的 MATLAB 仿真代码:
123456789101112131415161718close all;clear;clc;freq_baseband = 10e6;freq_carrier = 50e6;fs = freq_carrier * 8;t = 0:1/fs:1e-5;baseband_i = cos(2 * pi * t * freq_baseband);carrier_i = cos(2 * pi * t * freq_carrier);baseband_i = [baseband_i, zeros(1, 10000)]; % Suppress the fence effect(≧∇≦)ノcarrier_i = [carrier_i, zeros(1, 10000)];rf_i = baseband_i .* carr ...
IQ调制
假设要发送的基带码元为 ,其中 是同相分量, 是正交分量。首先对码元做上变频
取其实部得到调制后的信号为
接收端收到的信号为
进行下变频
再通过积分器或者低通滤波器
得到原始码元 .