
✨ 长期致力于TD-LTE、TD-SCDMA、多模、数字前端、数字校准研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1多速率多级抽取滤波与自动增益控制联合设计提出一种信道带宽自适应抽取滤波架构针对七种带宽(1.4/3/5/10/15/20MHz)动态配置抽取率。第一级采用CIC滤波器阶数为4抽取率根据带宽在4到16之间切换。第二级为CIC补偿滤波器系数长度5用于补偿通带衰减。第三级采用半带滤波器级联每级抽取因子2共3级。为降低乘法器数量将高阶FIR系数用量化CSD编码平均每个系数仅需2.3个加法器。自动增益控制采用双环结构前环基于信号功率快速估计后环使用数字积分器实现0.125dB步进。在20MHz带宽模式下接收数字前端总功耗为19.8mW邻道抑制达到58dB。2静态动态结合的两级直流偏移校正第一级校正位于模数转换器之前通过比较器检测直流分量反馈到模拟域进行粗调消除幅度大于ADC满量程5%的直流。第二级在数字域实现采用自适应陷波滤波器中心频率设为0Hz步长因子μ2^-10收敛时间小于200个采样点。滤波器系数更新公式为w(n1)w(n)μ*x(n)*e(n)其中误差e(n)x(n)-w(n)。该方案使得残余直流偏移低于-70dBFS且对温度漂移的适应时间缩短至原始方法的1/8。在TD-LTE 64QAM调制下解调EVM从无校正时的4.7%降至2.1%。3发射机IQ不平衡与本振泄漏的数字预补偿设计一个联合预失真补偿单元同时校正IQ增益失配、相位失配和本振泄漏。发射数字前端插入一个复乘器补偿参数为γ和d其中γ补偿增益相位d补偿直流。检测通路利用接收机数字前端形成负反馈在校准模式下发射已知单音信号通过接收通路分析镜像抑制比。采用逐次逼近算法迭代求解最佳补偿参数仅需8次迭代即可达到镜像抑制大于60dB。本振泄漏检测采用功率检测器同样使用SAR算法调整预补偿直流值。实际流片测试结果显示发射机镜像抑制达到61dB本振泄漏抑制达到59dB64QAM调制EVM为2.3%。整个补偿过程在设备上电初始化时自动完成耗时小于5ms。import numpy as np class MultiRateDecimator: def __init__(self, bw_mhz): self.bw bw_mhz self.rates self._calc_rates(bw_mhz) self.cic_order 4 self.cic_decim self.rates[0] self.hb_stages self.rates[1] def _calc_rates(self, bw): mapping {1.4: (16,1), 3:(8,2), 5:(8,2), 10:(4,3), 15:(4,3), 20:(4,3)} return mapping.get(bw, (4,3)) def cic_filter(self, x, R): y np.cumsum(x) y y[::R] return y def cic_compensator(self, x, gain1.0): b np.array([0.25, -0.5, 0.25]) * gain return np.convolve(x, b, modesame) def halfband_filter(self, x): hb_coeff np.array([0.0, 0.007, 0.0, -0.045, 0.0, 0.28, 0.5, 0.28, 0.0, -0.045, 0.0, 0.007, 0.0]) y np.convolve(x, hb_coeff, modesame) return y[1::2] def process(self, x): y self.cic_filter(x, self.cic_decim) y self.cic_compensator(y) for _ in range(self.hb_stages): y self.halfband_filter(y) return y class TwoStageDCOffsetCancel: def __init__(self, mu1/1024): self.mu mu self.w 0.0 def first_stage_analog(self, signal, fs, threshold0.05): dc_est np.mean(signal[:100]) if np.abs(dc_est) threshold * np.max(np.abs(signal)): correction -dc_est else: correction 0 return signal correction def second_stage_digital(self, x): y np.zeros_like(x) for n in range(1, len(x)): e x[n] - self.w self.w self.mu * e y[n] e return y def cancel(self, signal, fs): sig_corr1 self.first_stage_analog(signal, fs) return self.second_stage_digital(sig_corr1) class TxIQAndLoCompensator: def __init__(self): self.gain_comp 1.0 self.phase_comp 0.0 self.dc_i 0.0 self.dc_q 0.0 def compensate(self, I, Q): I_corr (I - self.dc_i) * self.gain_comp Q_corr (Q - self.dc_q) * self.gain_comp I_corr * self.phase_comp return I_corr, Q_corr def sar_calibrate(self, tx_func, rx_meas_func, n_iter8): for bit in range(n_iter): step 2 ** (n_iter - bit - 1) test_I np.array([1.0, 0.0]) test_Q np.array([0.0, 1.0]) tx_func(test_I, test_Q) mirror_power rx_meas_func() if mirror_power 0: self.gain_comp step * 0.01 else: self.gain_comp - step * 0.01 def lo_leakage_cal(self, tx_func, rx_power_func, n_iter8): for bit in range(n_iter): step 2 ** (n_iter - bit - 1) tx_func(np.array([0.0]), np.array([0.0])) power rx_power_func() if power 0: self.dc_i step * 0.001 else: self.dc_i - step * 0.001 return self.dc_i, self.dc_q class AGCWithPowerEst: def __init__(self, target_db0.0, step_db0.125): self.target target_db self.step step_db self.gain 0.0 def estimate_power(self, x): return 10*np.log10(np.mean(x**2) 1e-12) def update_gain(self, measured_power_db): error self.target - measured_power_db steps int(np.round(error / self.step)) self.gain steps * self.step self.gain np.clip(self.gain, -30, 30) return self.gain