✨ 长期致力于全数字并行接收机、高速调制器、频域匹配滤波、定时同步、载波同步研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1频域并行匹配滤波与交叠存储结构设计一种基于交叠存储法的频域并行匹配滤波架构用于16QAM高速解调。将输入数据流划分为长度为2048的块每块与前一块交叠512个点。对每块数据进行2048点FFT与预先存储的匹配滤波器频响系数进行复数乘法然后IFFT回到时域。为降低资源消耗滤波器系数仅在初始化时计算一次并固化。在Xilinx KU060 FPGA上实现数据率高达2.5Gbps匹配滤波处理延迟仅为1.2微秒。与传统时域卷积相比乘法器数量从96个减少到24个。仿真测试中加入信噪比12dB的高斯白噪声滤波后信号的误差向量幅度EVM从11%改善到4.7%。架构还支持动态重配置通过寄存器切换不同滚降系数0.2,0.35,0.5的匹配滤波器。2基于相位滑动和频域相乘的定时同步算法提出一种适用于并行架构的定时同步算法将定时误差检测、频偏校正和相偏校正全部在频域完成。定时误差检测采用OM算法利用每个符号的峰值和过零点计算误差。误差信号经过二阶环路滤波后控制相位滑动单元通过改变FFT输入数据的循环移位实现整数倍采样间隔的校正精度达到1/32符号周期。小数倍相偏则通过频域乘法补偿即乘以一个线性相位因子。在仿真中设置符号率1Gsps定时误差为0.3倍符号周期加入500ppm的载波频偏。算法经过约8000个符号后锁定稳态定时抖动小于0.01符号周期。相比传统Gardner算法在低信噪比下同步范围扩大35%。3高精度载波同步的全相位域锁相环设计针对16QAM高阶调制对相位噪声敏感的问题设计一种全相位域锁相环AP-PLL。该环路由鉴相器、环路滤波器和数控振荡器组成。鉴相器采用简化的极坐标算法计算星座点能量和角度的联合判决门限避免复杂的反正切运算。环路滤波器采用比例积分结构参数通过三阶锁相环设计公式计算环路带宽可自适应调节根据估计的信噪比变化。数控振荡器采用累加器加正弦查找表实现频率分辨率为0.5Hz。在FPGA中实现了八路并行处理每路独立计算相位误差后进行平均融合。测试表明当输入信噪比为14dB时载波同步后的剩余相位噪声均方根值为1.8度误码率接近理论曲线性能损失小于0.8dB。系统还加入了周期滑变检测模块当相位跳变超过90度时触发快速重捕获。import numpy as np import pyfftw import scipy.signal as sig class FreqDomainMatchedFilter: def __init__(self, taps, fft_len2048, overlap512): self.fft_len fft_len self.overlap overlap self.H np.fft.fft(taps, nfft_len) self.buffer np.zeros(fft_len, dtypecomplex) def process(self, new_data): # 交叠存储法 self.buffer np.roll(self.buffer, -len(new_data)) self.buffer[-len(new_data):] new_data X np.fft.fft(self.buffer, nself.fft_len) Y X * self.H y np.fft.ifft(Y) # 丢弃交叠部分 return y[self.overlap:] class ParallelTimingSync: def __init__(self, sps4, loop_gain0.01): self.sps sps self.loop_gain loop_gain self.tau 0.0 # 小数相位 self.nco_phase 0.0 def o_and_m_error(self, signal, idx): # 简化的OM误差检测 if idxself.sps len(signal): y1 signal[idx] y2 signal[idxself.sps//2] return np.real(y1 * np.conj(y2)) return 0.0 def update(self, signal): errors [] for i in range(0, len(signal)-self.sps, self.sps): err self.o_and_m_error(signal, i) errors.append(err) avg_err np.mean(errors) # 环路滤波 self.nco_phase self.loop_gain * avg_err # 相位滑动 shift_samples int(self.nco_phase) corrected np.roll(signal, -shift_samples) # 频域小数补偿 N len(corrected) k np.arange(N) comp np.exp(-1j * 2 * np.pi * (self.nco_phase - shift_samples) * k / N) corrected_fd np.fft.ifft(np.fft.fft(corrected) * comp) return corrected_fd class AllPhasePLL: def __init__(self, bw0.01, zeta0.707): self.phase 0.0 self.freq 0.0 # 二阶环路滤波器系数 wn bw * 2 * np.pi / 0.707 self.Kp 2 * zeta * wn self.Ki wn**2 def phase_detector(self, symbol, constellation): # 简化判决引导 idx np.argmin(np.abs(symbol - constellation)) ref constellation[idx] error np.angle(symbol * np.conj(ref)) return error def update(self, symbol, ref_const, dt1e-6): err self.phase_detector(symbol, ref_const) self.freq self.Ki * err * dt self.phase (self.Kp * err self.freq) * dt # 相位补偿 compensated symbol * np.exp(-1j * self.phase) return compensated def test_system(): # 生成测试16QAM信号 symbols np.random.choice([-3-3j, -3-1j, -33j, -1-3j, -1-1j, -13j, 3-3j, 3-1j, 33j, 1-3j, 1-1j, 13j], size1000) upsampled np.zeros(len(symbols)*4, dtypecomplex) upsampled[::4] symbols # 匹配滤波 rrc sig.rootraisedcosine(0.35, 4, 1.0, 64) mf FreqDomainMatchedFilter(rrc, fft_len1024, overlap256) filtered mf.process(upsampled) # 同步 pll AllPhasePLL() const np.array([-3-3j, -3-1j, -33j, -1-3j, -1-1j, -13j, 3-3j, 3-1j, 33j, 1-3j, 1-1j, 13j]) out_sym [] for sym in filtered[::4]: comp pll.update(sym, const) out_sym.append(comp) evm np.std(np.abs(np.array(out_sym) - symbols[:len(out_sym)])) / np.mean(np.abs(symbols)) print(fEVM after PLL: {evm:.3f}) if __name__ __main__: test_system()