全国大学生电子设计竞赛2017年E题 自适应滤波器

本文探讨了如何使用实时采样进行自适应滤波,针对10Hz频率分辨率的要求,选择了4MHz的采样率,并通过Matlab仿真分析了不同噪声类型下能量变化的规律。算法通过寻找能量斜率为负的点并进行二分搜索来确定最佳移相点。最终,实现了在1s内进行多次滤波的目标。文章还提到了加法器、移相器和自适应滤波器的硬件实现,特别是FPGA在延时和采样计算中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题拟采用实时采样的方式来进行自适应滤波。

学过数字信号处理都知道,频率分辨率是采样率除以采样点数,而这道题提高部分要求10Hz的分辨率,经过前期的分析,我们采用采样率为4MHz,那么就是说我们需要采样到至少400k个点才能进行一次自适应,而采样这么多点需要的时间是1/10 = 0.1s,所以每进行一次自适应就需要花费0.1s的时间。
而提高部分又要求要在1s内完成,所以我们大概可以进行7到8次的滤波。

经过matlab仿真不断移相噪声相减得到的相减波形能量如下结果

在这里插入图片描述
噪声是正弦波时,移相的能量变化图

在这里插入图片描述
噪声是三角波时,移相的能量变化图

在这里插入图片描述
噪声是方波时,移相的能量变化图

通过前期的matlab能量仿真我们发现,能量都可以近似看成周期性变化的单调函数。为了分析方便我这里直接把几种不同的噪声移相产生的能量都看成三角波。

算法思路

在这里插入图片描述
先找到一个这样的A点,该点能量斜率为负(即能量是随着移相点数增加而减小的),然后再在这个点之后找到能量上升的一个点,然后找到AB横坐标中点C,选取AB中能量小的那个和C组成新的能量对,继续找中点,直到迭代到最低点结束迭代。

下面是matlab算法验证

fa=10010;        %设置波形频率 
fb=10000;
Fs=16000000;        %设置采样频率
L=1600000 + 1600;         %数据长度
%=============产生输入信号==============%
t=0:1/Fs:(1/Fs)*(L-1);


A = sin(2*pi*fa*t+pi/3);
B = square(2*pi*fb*t);


D = sin(2*pi*fa*t+pi/3+pi)+square(2*pi*fb*t+pi);
%


%     for i = 1:1600
%     E = D(i:L-1600+i-1) - B(1:L-1600);
%     energy(i) = sum(E.^2);
%         
%         
%     end

%



%由于能量曲线的频率是根据噪声的周期来的,噪声的最大频率是100k,我们取两个大点的间隔的时候不能超过噪声的半个周期,所以最大的间隔点数小于40

%先找到第一个斜率下降的点
x_1 = 1;
x_2 = x_1 + 1;
x_3 = x_1 + 41;
x_4 = x_3 - 1;
energy_x_1 = cal_energy(D,B,x_1,L);
energy_x_2 = cal_energy(D,B,x_2,L);
energy_x_3 = cal_energy(D,B,x_3,L);
energy_x_4 = cal_energy(D,B,x_4,L);
while(slope(energy_x_2,energy_x_1,x_2,x_1) >= 0 || slope(energy_x_3,energy_x_4,x_3,x_4) <= 0)
    x_1 = x_1 + 41;
    x_2 = x_1 + 1;
    x_3 = x_1 + 40;
    x_4 = x_3 - 1;
    energy_x_1 = cal_energy(D,B,x_1,L);
    energy_x_2 = cal_energy(D,B,x_2,L);
    energy_x_3 = cal_energy(D,B,x_3,L);
    energy_x_4 = cal_energy(D,B,x_4,L);
end

     x_1 = x_2;
    x_mid = x_2 + 20;
    x_2 = x_2 + 40;
    energy_x_1 = cal_energy(D,B,x_1,L);
    energy_x_2 = cal_energy(D,B,x_2,L);
    
    if(energy_x_1 < energy_x_2)
       % x_1 = x_1;
        x_2 = x_mid;
    elseif(energy_x_1 > energy_x_2)
        x_1 = x_mid;
       % x_2 = x_2;
    else
        output = (x_1 + x_2)/2;
    end
    x_mid = (x_1 + x_2)/2;

%找到那个第一个斜率下降的点之后,开始进行二分搜索
for i = 1: 5
    energy_x_1 = cal_energy(D,B,x_1,L);
    energy_x_2 = cal_energy(D,B,x_2,L);
    if(energy_x_1 < energy_x_2)
       % x_1 = x_1;
        x_2 = x_mid;
    elseif(energy_x_1 > energy_x_2)
        x_1 = x_mid;
       % x_2 = x_2;
    else
        output = (x_1 + x_2)/2;
    end
    x_mid = (x_1 + x_2)/2;
end
   output = uint32((x_1 + x_2)/2 + 0.5);
    
E_lvbo = D - square(2*pi*fb*(t-double(output)./Fs));
figure;
plot(t,E_lvbo);  
Hd = LPF;
fil_E = filter(Hd,E_lvbo);
figure;
plot(t,fil_E);
    
    

其中slope函数如下

function y = slope(y2,y1,x2,x1)
    y = (y2 - y1)./(x2 - x1);

end

计算能量函数cal_energy如下

function y = cal_energy(D,B,i,L)
    i = uint32(i);
    E = D(i:L+i-1 - 1600) - B(1:L-1600);
    y = sum(E.^2);  
end

试题实现

第一部分:加法器

在这里插入图片描述
加法器采用硬件加法器,这个一个运放几个电阻就可以搭好,这里就不再赘述。

第二部分:移相器

移相器,由于硬件移相器对方波等存在高次谐波的信号移相效果略差,所以采用数字移相的方式来实现这部分内容。

这里我移相的方法采用硬件移相的方法,就是利用FPGA内部的FIFO存储数据以延时。所以我如果有两个信号,我对其中一个信号的延时即是两个信号的相位差发生了改变。

根据这个原理我们知道,FIFO存储的话一定是延时,所以在后续的自适应滤波器里面,我们要延时的信号也是B信号。

第三部分:自适应滤波器

在这里插入图片描述

MCU与FPGA部分实现

MCU要实现的函数:
1、发送延时量
2、计算斜率
3、判断最佳能量点

FPGA要实现的module
1、SPI
2、Sampling
FPGA要干的就是延时,然后采样计算能量发送,其他的没什么活

采样率8M,要分辨10Hz的信号,那么就是至少要采样8M/10个点,即总共要计算800k次,而每采样一次将花费大约0.1s的时间。

当采样完毕后将计算好的能量发送给MCU进行下一次的计算。

### 2017全国大学生电子设计竞赛E自适应滤波器解析 2017全国大学生电子设计竞赛E自适应滤波器”是一道涉及信号处理和路设计的综合性目。该目要求参者设计并实现一个基于数字信号处理(DSP)技术的自适应滤波器系统,能够对输入信号进行实时处理,以达到特定的滤波效果[^1]。 #### 目背景与目标 目背景设定为需要通过自适应算法动态调整滤波器参数,以适应不同场景下的信号处理需求。具体目标包括: - 实现一种自适应滤波算法(如LMS或NLMS算法)。 - 构建硬件平台,支持实时信号采集、处理和输出。 - 对特定噪声环境下的信号进行滤波处理,并评估滤波效果。 #### 技术要点解析 1. **自适应滤波算法** 自适应滤波的核心在于通过迭代算法不断调整滤波器系数,使误差信号最小化。常用的算法包括最小均方误差(LMS)算法及其改进版本归一化LMS(NLMS)算法。这些算法能够在未知噪声特性的情况下,逐步逼近最优滤波器系数[^2]。 2. **硬件设计** 硬件部分通常基于嵌入式系统实现,常见的方案包括使用DSP芯片或FPGA作为核心处理器。以下是一个典型的硬件架构: - 输入信号采集:通过ADC模块将模拟信号转换为数字信号。 - 信号处理:在DSP或FPGA中运行自适应滤波算法。 - 输出信号生成:通过DAC模块将处理后的数字信号还原为模拟信号。 ```python # 示例代码:基于Python的LMS算法实现 def lms_algorithm(x, d, mu, N): w = [0 for _ in range(N)] # 初始化滤波器系数 y = [] # 输出信号 e = [] # 误差信号 for n in range(len(x)): if n >= N: xn = x[n - N:n][::-1] yn = sum(w[i] * xn[i] for i in range(N)) en = d[n] - yn w = [w[i] + mu * en * xn[i] for i in range(N)] y.append(yn) e.append(en) return y, e, w ``` 3. **滤波器参数调整** 根据目要求,参者需要通过实验确定关键参数,例如步长因子μ、滤波器阶数N等。此外,还需要考虑硬件资源限制对算法实现的影响。例如,在RC乘积确定的情况下,可以通过调节阻R或容C来优化路性能,而不会影响系统的稳定时间[^2]。 4. **性能评估** 性能评估是解决方案的重要组成部分,主要包括以下几个方面: - 滤波效果:通过信噪比(SNR)或均方误差(MSE)等指标衡量滤波器的性能。 - 实时性:验证系统是否能够在规定时间内完成信号处理任务。 - 稳定性:测试滤波器在不同输入条件下的稳定性表现。 #### 解决方案示例 以下是一个简化的解决方案框架: 1. **理论分析**:根据目要求选择合适的自适应滤波算法,并推导其数学模型。 2. **仿真验证**:利用MATLAB或Python等工具对算法进行仿真测试,优化参数配置。 3. **硬件实现**:搭建硬件平台,完成信号采集、处理和输出功能。 4. **实验验证**:通过实际测试验证系统性能,并记录实验数据。 ```matlab % MATLAB代码:LMS算法仿真 clc; clear; N = 8; % 滤波器阶数 mu = 0.01; % 步长因子 x = randn(1, 1000); % 输入信号 d = filter([1], [1, -0.8], x) + 0.1 * randn(1, 1000); % 目标信号 w = zeros(1, N); % 初始化滤波器系数 y = zeros(1, length(x)); % 输出信号 e = zeros(1, length(x)); % 误差信号 for n = N+1:length(x) X = x(n:-1:n-N+1)'; y(n) = w * X; e(n) = d(n) - y(n); w = w + mu * e(n) * X'; end figure; plot(e); title('误差信号'); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值