✨ 长期致力于全数字并行接收机、高速调制器、频域匹配滤波、定时同步、载波同步研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(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)基于相位滑动和频域相乘的定时同步算法:
提出一种适用于并行架构的定时同步算法,将定时误差检测、频偏校正和相偏校正全部在频域完成。定时误差检测采用O&M算法,利用每个符号的峰值和过零点计算误差。误差信号经过二阶环路滤波后,控制相位滑动单元:通过改变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_len=2048, overlap=512): self.fft_len = fft_len self.overlap = overlap self.H = np.fft.fft(taps, n=fft_len) self.buffer = np.zeros(fft_len, dtype=complex) 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, n=self.fft_len) Y = X * self.H y = np.fft.ifft(Y) # 丢弃交叠部分 return y[self.overlap:] class ParallelTimingSync: def __init__(self, sps=4, loop_gain=0.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): # 简化的O&M误差检测 if idx+self.sps < len(signal): y1 = signal[idx] y2 = signal[idx+self.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, bw=0.01, zeta=0.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, dt=1e-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, -3+3j, -1-3j, -1-1j, -1+3j, 3-3j, 3-1j, 3+3j, 1-3j, 1-1j, 1+3j], size=1000) upsampled = np.zeros(len(symbols)*4, dtype=complex) upsampled[::4] = symbols # 匹配滤波 rrc = sig.rootraisedcosine(0.35, 4, 1.0, 64) mf = FreqDomainMatchedFilter(rrc, fft_len=1024, overlap=256) filtered = mf.process(upsampled) # 同步 pll = AllPhasePLL() const = np.array([-3-3j, -3-1j, -3+3j, -1-3j, -1-1j, -1+3j, 3-3j, 3-1j, 3+3j, 1-3j, 1-1j, 1+3j]) 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(f'EVM after PLL: {evm:.3f}') if __name__ == '__main__': test_system()