Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
数字滤波器笔记(三)基于高云的FIR滤波器
系统概述 系统时钟为24MHz,使用高云GW2A FPGA从AD9280读取数据后经过一个FIFO作为缓冲,经FIR滤波器处理之后使用AD9708输出。AD9280与AD9708都使用八位并口传输数据。FIFO与FIR滤波器使用高云IP核。FIR滤波器系数使用Matlab的FDATOOL生成。 滤波器系数生成 到处时选择导出为C头文件,这样系数是有符号十进制数。将这些系数复制到一个文本文件中,一行一个系数,不要有其他符号。 IP核生成 选择’Advanced FIR Filter’IP核。 我在上一个步骤中生成的FIR系数是偶对称、偶整数,具有50个抽头系数,为14位量化。因此’FIR Type’选择’fir symmetry’以节省硬件资源。下方的’Coefficient File’选择上一步骤中的文本文件。 FIFO我选择了异步FIFO,为以后的拓展留下空间。 代码 module top ( input clk, input rst_n, output da_clk, output reg [7:0] da_data, output ad_clk, input [7:0] ad_data ); assign ad_clk = clk24m; assign da_clk = clk24m; wire fir_valid_out; wire fir_sync_out; wire [20:0] fir_data_out; wire signed [7:0] signed_fifo_dout; assign signed_fifo_dout = fifo_dout - 8'd128; Advanced_FIR_Filter_Top u_fir( .clk(clk24m), //input clk .rstn(rst_n), //input rstn .fir_rfi_o(), //output fir_rfi_o ....
数字滤波器笔记(二)FIR滤波器的Matlab设计
线性相位系统的物理意义 考虑一个具有线性相位的理想低通滤波器,其频率响应定义如下: $$ H_{lp}=\begin{cases}e^{-j\omega n_d},&|\omega|\leq\omega_c\\0,& \omega_c\leq|\omega|\leq\pi\end{cases} $$ 对其进行离散傅里叶逆变换,得到它的单位脉冲响应: $$ h_{\text{lp}}(n) = \frac{1}{2\pi}\int_{-\omega_{\text{c}}}^{\omega_{\text{c}}} e^{-j\omega n_{\text{d}}} e^{j\omega n} \,d\omega = \frac{\sin\omega_{\text{c}}(n-n_{\text{d}})}{\pi(n-n_{\text{d}})},\quad -\infty < n < \infty $$ 而一个理想的低通滤波器的单位脉冲响应为: $$ \frac{\sin\omega_\text{c}n}{\pi n},\quad-\infty< n <\infty $$ 可以看出具有线性相位的低通滤波器与零相位的理想低通滤波器的差别只是出现了延时。线性相位的滤波器可以保证信号通过系统后,各种频率成分之间的相对相位关系保持不变。 通常用群延迟$τ(ω)$表征相位的线性: $$ \tau(\omega)=\mathrm{grd}[H(\mathrm{e}^{\mathrm{j}\omega})]=-\frac{\mathrm{d}}{\mathrm{d}\omega}\left\{\mathrm{arg}[H(\mathrm{e}^{\mathrm{j}\omega})]\right\} $$ 一个线性相位的系统,它的群延迟应该是一个常数。 FIR滤波器 原理 $$ H(z)=\sum_{n=0}^{N-1}h(n)z^{-n}=h(0)+h(1)z^{-1}+\cdots+h(N-1)z^{-(N-1)} $$ 从系统函数可以看出,FIR滤波器只在原点上有极点,这使得FIR系统具有全局稳定性。FIR滤波器的结构也被称为抽头延迟线结构。 延迟线(Delay Line): 指的是用来存储输入信号 $x(n)$ 及其过去的 $N−1$ 个样本的结构。这些样本分别是 $x(n),x(n−1),x(n−2),…,x(n−(N−1))$。这通常通过一系列延迟单元(例如,Z⁻¹ 单元,表示一个单位延迟)来实现。 抽头(Tap): 指的是从延迟线上的每一个延迟单元的输出端“抽取”出一个信号。每个抽头都对应输入信号的一个特定延迟版本(例如,$x(n), x(n−1),$ 等等)。 乘法器(Multipliers): 每个从延迟线“抽”出来的信号($x(n−k$))都会与相应的滤波器系数 h(k) 进行相乘。这些滤波器系数就是 FIR 滤波器的单位取样响应的数值。 加法器(Summing / Adder): 所有这些乘法器($h(k)x(n−k)$)的输出会被汇集起来,通过一个加法器进行求和,从而得到最终的输出 $y(n)$。 特性 相位特性 并非所有FIR滤波器都具有严格的线性相位特性。只有当单位脉冲响应$h(n)$满足对称条件时,FIR滤波器才具有线性相位特性。...
数字滤波器笔记(一)
基础 数字信号处理时常用角频率($rad/s$)。它和物理频率的转换关系如下: $$ ω=2π \frac{f_s}{f} $$ 其中$f_s$为采样频率,$f$为物理频率。 数字滤波器的分类 经典滤波器 经典滤波器主要包括低通、高通、带通、带阻和全通滤波器。经典滤波器假定输入信号$x(n)$的有效信号和噪声分布在不同频段,当$x(n)$通过一个线性滤波系统之后,噪声能被很好的消减。然而当有效信号和噪声的频带重叠,传统滤波器将无能为力。 经典滤波器的幅频特性响应示意图: 数字滤波器的幅频特性相对于$π$对称,以$2π$为周期。周期性是采样过程的直接结果。当对连续信号进行采样时,信号的频谱会以采样频率$f_s$(对应数字角频率$2π$ 为周期进行延拓和叠加。 现代滤波器 现代滤波器主要包括维纳滤波器、卡尔曼滤波器、线性预测器等。现代滤波器将有效信号和噪声都视为随机信号,并使用统计方法推导出最佳的估值算法。 有限脉冲响应(FIR) FIR滤波器的输出仅仅是当前和过去输入样本的加权和。它的冲激响应在有限时间内衰减为零。 FIR滤波器的系统函数: $$ H(z)=\sum_{n=0}^{N-1}h(n)z^{-n} $$ FIR滤波器不存在反馈环路,具有线性相位特性。 无限脉冲响应(IIR) IIR滤波器的输出不仅依赖于当前和过去的输入样本,还依赖于过去的输出样本。它的冲激响应理论上会无限持续下去。 IIR滤波器的系统函数: $$ H(z)=\frac{\sum_{i=0}^Mb_iz^{-i}}{1-\sum_{l=1}^Na_lz^{-l}} $$ IIR滤波器存在反馈环路,不具有线性相位特性,且频率选择性越好的非线性特性越显著。 频域滤波器 有时噪声将在时域下难以处理,如信号频段内的强窄带干扰。然而这种干扰在频域下却很容易识别。频域滤波器正是将信号转换到频域进行处理,然后再转换回时域。 滤波器的特征参数 通带内允许的最大衰减$α_p$与阻带内允许的最小衰减$α_s$: $$ \alpha_{\mathrm{p}}=20\lg\frac{|H(\mathrm{e}^{\mathrm{j}\omega_{\mathrm{0}}})|}{|H(\mathrm{e}^{\mathrm{j}\omega_{\mathrm{p}}})|}\mathrm{dB}=-20\lg|H(\mathrm{e}^{\mathrm{j}\omega_{\mathrm{p}}})|(\mathrm{dB}) \\\alpha_{\mathrm{s}}=20\lg\frac{|H(\mathrm{e}^{\mathrm{j}\omega_{0}})|}{|H(\mathrm{e}^{\mathrm{j}\omega_{\mathrm{s}}})|}\mathrm{dB}=-20\lg|H(\mathrm{e}^{\mathrm{j}\omega_{\mathrm{s}}})|(\mathrm{dB}) $$ 其中$\mid H(\mathrm{e}^{\mathrm{j}\omega_0})\mid$归一化为$1$。当$\frac{\mid H(\mathrm{e}^{\mathrm{j}\omega_{0}})\mid}{\mid H(\mathrm{e}^{\mathrm{j}\omega_{p}})\mid}=\frac{\sqrt{2}}{2}=0.707$时,$α_p=3dB$,称此时的$ω_p$为该低通滤波器的$3dB$通带截止频率。在信号处理中,3 dB 截止频率通常被认为是信号能量减半的点。 有限字长效应 在数字系统中主要有三种由于有限字长而引起误差的 因素。 模/数(A/D)转换器把模拟输入信号转换成一组离散电平时产生的量化效应; 用有限位二进制数表示系数时产生的量化效应; 在数字运算过程中,为限制位数进行的尾数处理和为防止溢出而压缩信号电平的有限 字长效应。 量化过程可以等效为在无限精度的数上叠加一个噪声: $$ x'(n)=Q[x(n)]=x(n)+e(n) $$ 滤波器运算中的字长效应 为什么不增加字长来保证运算过程不产生截尾或者舍入操作? 对于数字滤波器或较为复杂的电路系统来讲,通常会用到反馈网络,这样每一次闭环运算都会增加一部分字长,循环运算下去势必要求越来越多的寄存器资源,长的增加是单调增加的,也就是说,随着运算的持续,所需寄存器资源是无限增加的。 考虑一个一阶数字滤波器,系统函数为: $$ H(z)=\frac{1}{1+0.5z^{-1}} $$ 在无限精度运算的境况下,差分方程为: $$ y(n)=-0.5y(n-1)+x(n) $$ 在定点数运算中,每次乘加运算后都必须对尾数进行舍入或截尾处理,即量化处理,而 量化过程是一个非线性过程,处理后相应的非线性差分方程变为: $$ w(n)=Q[-0.5w(n-1)+x(n)] $$
常用电路
# 电源类 TL431基准电压源 输入电压必须大于输出电压1.2V以上。 $V_{ref}=2.495V$ $I_{ref}$非常小,只有2-4μA。 电阻$R_1$与$R_2$越精密,输出电压越准确。 带载电流1-100mA,$I_{KA} = V_{in}/R_{in}$。 $V_{KA}$的对地电容必须大于10uf。 典型应用: 2.5V电压基准
简单了解向量搜索
前言 最近看了篇文章,了解到了Vector Search。什么是Vector Search?来看看GPT的解释: 向量搜索是一种利用向量表示数据,并基于向量之间的相似性进行搜索的技术。它不同于传统的基于关键词的搜索,能够捕捉数据之间更深层次的语义关系,从而提高搜索的准确性和效率。 相较于基于关键词的搜索,将文本、图片等非数值型数据转换为向量形式,更能发现数据的特征,并发现数据之间的相似性。 至于如何将非数值型数据转换为向量,来开下面这个例子: 用“1”表示“是”,用“0”表示“否” 交通工具 轮子数量 有引擎吗 陆地上运动吗 最大承载人数 汽车 $4$ $1$ $1$ $4$ 自行车 $2$ $0$ $1$ $1$ 三轮车 $3$ $0$ $1$ $1$ 摩托车 $2$ $1$ $1$ $1$ 帆船 $0$ $0$ $0$ $20$ 轮船 $0$ $0$ $0$ $1000$ 把非数值型数据转换为向量,实际上就是把这些数据的特征用数值表示。比如对于汽车来说,它在这个例子中对应的向量就是$(4,1,1,4)$。 基础理论 向量之间的相似性 观察向量$\vec{a}$,$\vec{b}$和$\vec{p}$,哪个向量与$\vec{p}$更“相似”?向量$\vec{a}$与$\vec{p}$有着相同的方向,但模长更小;而$\vec{b}$与$\vec{p}$有着相同的模长,但方向只是相近。如果相似指的是方向上的相似,那么$\vec{a}$与$\vec{p}$更相似。而如果相似指的是模长,那么$\vec{b}$与$\vec{p}$更相似。 在矢量搜索中,很少单独根据模长来判断两个向量是否相似。相似性通常取决于方向,或者方向和模长。 相似性的评估方法 评估两个向量是否相似,通常有四种数学方法: 欧式距离:直接计算两个向量“箭头”的直线距离。 $d(\vec{a}, \vec{p}) = \sqrt{\sum_{i=1}^{n} (a_i - p_i)^2}$ $a_i$表示$\vec{a}$的第$i$个分量 曼哈顿距离:计算两个点之间沿着坐标轴行走的距离。 $d_1(\vec{a}, \vec{p}) = \sum_{i=1}^{n} |a_i - p_i|$ $a_i$表示$\vec{a}$的第$i$个分量 点积:将相同维度的分量相乘再相加。 $\vec{a} \cdot \vec{p} = \sum_{i=1}^{n}(a_i b_i)$ 余弦值:两个向量夹角的、余弦值。 $\cos(\theta) = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}| |\vec{b}|}$ 这四种方法中,欧氏距离是最常用的,而曼哈顿距离与欧氏距离相似,应用这两种方法得到的结果通常也相似。而当需要评估相似性的向量模长一致时,使用余弦值是更好的方法,因为它只与夹角相关。点积与余弦值类似,但在需要大量计算的情况下,点积通常有着更好的性能。 简单的例子 由于在屏幕上呈现二维向量较为方便,因此选取前言中的“轮子数量”与“有引擎吗”作为特征。得到4个向量,分别是$(4,1),(2,0),(3,0),(2,1)$,它们在图上呈现为: 随后分别计算摩托车与自行车、三轮车、汽车的相似性:...