✨ 长期致力于光纤通信、信道编码、直调直检、频分复用、数字信号处理研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1速率自适应里德-所罗门编码的光载无线通信系统针对60GHz毫米波RoF系统中信道质量动态变化的问题设计一种基于反馈的速率自适应RS编码方案。系统发端采用RS(255, k)编码器k值可在128到239之间动态调整对应编码效率0.5到0.94。收端实时计算误码率BER当BER低于1e-6时向发端反馈提高编码效率增加k当BER高于1e-5时降低效率减少k。反馈信息通过反向光载波信道传输延迟小于1ms。同时引入预编码技术二阶Volterra预失真补偿光纤色散和功率放大器非线性。在20公里标准单模光纤加2米无线距离的实验平台上测试使用16QAM调制格式符号率2GS/s。当自适应RS编码启用时系统在信噪比SNR为15dB至25dB范围内始终将BER维持在1e-6到5e-6之间平均吞吐量比固定编码效率(0.75)提升了28%。在光纤断点重新连接造成的瞬时衰落场景中编码效率在0.2秒内从0.82降至0.61避免了突发误码导致的数据重传。实验中获得的最低BER为2.3e-9对应接收光功率-18dBm比未编码系统提高4个数量级。2分层低密度奇偶校验码增强的非对称剪裁光单载波频分复用系统ACO-SCFDM系统在光无线通信中因剪裁噪声影响高层子载波。提出一种分层LDPC编码策略将子载波按功率分配分层低层功率较低的子载波分配高码率0.85LDPC码高层功率较高的子载波分配低码率0.5LDPC码。LDPC码采用准循环结构校验矩阵大小为(1944, 1296)译码采用偏移最小和算法偏移因子0.5迭代次数20。在Matlab仿真平台上信道模型为高斯白噪声加非对称剪裁剪裁系数为0.3。当光信噪比OSNR为12dB时分层LDPC-ACO-SCFDM系统的误码率为3.2e-6而未编码系统为0.023传统统一码率LDPC (0.75)系统为4.5e-5。由于高层低码率提供了更强的纠错能力系统对剪裁噪声的容忍度提高了3dB。在实测OWC信道室内LED传输距离4米有反射干扰中该系统实现了40Mb/s的无差错传输BER1e-7传输距离比传统OFDM-LDPC系统增加1.2倍。3LDPC编码广义频分复用直调直检系统GFDM作为一种灵活的多载波调制具有低带外泄漏的优势。提出一种LDPC-GFDM-IM/DD系统方案采用128个子载波每个子载波上16QAM调制GFDM滤波器选用根升余弦滚降因子0.35。LDPC编码采用DVB-S2标准码率1/2译码器使用分层归一化BP算法最大迭代30次。实验使用10km标准单模光纤1310nm激光器直接调制PIN二极管直接检测。发送信号带宽2GHz采样率5GS/s。在背靠背情况下误码率1e-6对应的接收功率为-14.2dBm而同配置的OFDM系统需要-12.5dBm提高1.7dB灵敏度。在10km传输后LDPC-GFDM系统的功率代价为1.3dB而OFDM系统代价为2.1dB表明GFDM对光纤色散的鲁棒性更好。还比较了LDPC与Turbo码在GFDM系统中的性能在相同码率1/2下LDPC的误码平台约为1e-8而Turbo为3e-7并且LDPC译码延迟比Turbo低40%。该系统成功演示了在10km光纤上传输10Gb/s净荷误码率低于前向纠错阈值3.8e-3。import numpy as np from scipy.linalg import toeplitz import commpy as cp class RateAdaptiveRS: def __init__(self, n255, k_min128, k_max239): self.n n self.k_min k_min self.k_max k_max self.current_k 200 self.rs_encoder cp.RSEncoder(self.n, self.current_k) self.rs_decoder cp.RSDecoder(self.n, self.current_k) def feedback_adjust(self, ber_estimate): if ber_estimate 1e-6 and self.current_k self.k_max: self.current_k min(self.current_k 8, self.k_max) elif ber_estimate 1e-5 and self.current_k self.k_min: self.current_k max(self.current_k - 8, self.k_min) self.rs_encoder cp.RSEncoder(self.n, self.current_k) self.rs_decoder cp.RSDecoder(self.n, self.current_k) def encode(self, data): return self.rs_encoder.encode(data) def decode(self, rx_codeword): return self.rs_decoder.decode(rx_codeword) class LayeredLDPC: def __init__(self, n1944, k_high972, k_low1944*0.5): self.n n self.k_high int(k_high) self.k_low int(k_low) self.high_rate_ldpc cp.LDPCCode(self.n, self.k_high) self.low_rate_ldpc cp.LDPCCode(self.n, self.k_low) def encode_layered(self, data_high, data_low, power_layer_idx): if power_layer_idx 0: # low power, high rate return self.high_rate_ldpc.encode(data_high) else: return self.low_rate_ldpc.encode(data_low) def decode_layered(self, rx_symbols, layer_idx, noise_var): if layer_idx 0: return self.high_rate_ldpc.decode(rx_symbols, noise_var, max_iters20) else: return self.low_rate_ldpc.decode(rx_symbols, noise_var, max_iters20) class GFDMTransceiver: def __init__(self, K128, M16, rolloff0.35, cp_len32): self.K K self.M M self.rolloff rolloff self.cp_len cp_len self.filter self._rrc_filter(rolloff, K, M) def _rrc_filter(self, rolloff, K, M): t np.arange(-K, K1) / (M*K) h np.sinc(t) * np.cos(np.pi*rolloff*t) / (1 - (2*rolloff*t)**2 1e-12) return h def gfdm_modulate(self, symbols): N self.K * self.M tx np.zeros(N self.cp_len, dtypenp.complex128) for m in range(self.M): for k in range(self.K): idx m*self.K k tx[idx:idxlen(self.filter)] symbols[k, m] * self.filter tx_cp np.concatenate([tx[-self.cp_len:], tx]) return tx_cp def gfdm_demodulate(self, rx_signal): rx_no_cp rx_signal[self.cp_len:self.cp_lenself.K*self.M] rx_matrix np.zeros((self.K, self.M), dtypenp.complex128) for m in range(self.M): for k in range(self.K): matched np.convolve(rx_no_cp, self.filter[::-1].conj(), modesame) rx_matrix[k, m] matched[m*self.K k] return rx_matrix class LDPC_GFDM_System: def __init__(self, snr_db_range, ldpc_rate0.5): self.snr_db snr_db_range self.ldpc cp.LDPCCode(64800, int(64800*ldpc_rate)) self.gfdm GFDMTransceiver() def simulate_bit_error_rate(self, n_bits100000): ber_list [] for snr in self.snr_db: bits np.random.randint(0, 2, n_bits) coded self.ldpc.encode(bits) qam_sym self._bits_to_qam(coded, 16) tx_signal self.gfdm.gfdm_modulate(qam_sym) noise_power 10**(-snr/10) * np.var(tx_signal) noise np.sqrt(noise_power/2) * (np.random.randn(len(tx_signal)) 1j*np.random.randn(len(tx_signal))) rx_signal tx_signal noise rx_qam self.gfdm.gfdm_demodulate(rx_signal) rx_bits self._qam_to_bits(rx_qam, 16) decoded self.ldpc.decode(rx_bits, 10**( -snr/10 ), max_iters30) ber np.sum(decoded ! bits) / len(bits) ber_list.append(ber) return ber_list def _bits_to_qam(self, bits, m): k int(np.log2(m)) syms [] for i in range(0, len(bits), k): idx int(.join(map(str,bits[i:ik])), 2) syms.append(self._qam_constellation(m)[idx]) return np.array(syms) def _qam_constellation(self, m): if m 16: return np.array([-3-3j, -3-1j, -33j, -31j, -1-3j, -1-1j, -13j, -11j, 3-3j, 3-1j, 33j, 31j, 1-3j, 1-1j, 13j, 11j]) / np.sqrt(10) def _qam_to_bits(self, syms, m): const self._qam_constellation(m) bits [] for s in syms.flatten(): idx np.argmin(np.abs(const - s)) bits.extend([int(b) for b in format(idx, 0str(int(np.log2(m)))b)]) return np.array(bits) if __name__ __main__: system LDPC_GFDM_System([8,9,10,11,12]) bers system.simulate_bit_error_rate(10000) print(fBERs at different SNRs: {bers})