程序1 m1、m2序列以及自相关、互相关程序2gold序列自相关、互相关及功率谱实验3扩频前、扩频后曲线程序4扩频前扩频后频谱程序5扩频与未扩频BPSK在AWGN下的误码率对比PS在AWGN信道中直接序列扩频不改变误码率性能不抑制白噪声扩频与未扩频的误码率曲线应相同%程序1 m1、m2序列以及自相关、互相关 clc;clear;close all; m1[1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0]; m2[1 1 1 1 1 0 1 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 0 0]; figure; subplot(5,1,1);stem(m1);title(m1时域波形); subplot(5,1,2);stem(m2);title(m2时域波形); %求相关函数 a1m1;a2m1; a1_1m2;a1_2m2; b1m1;b2m2; for k1:1:31*5 x1xor(a1,a2);x1_1xor(a1_1,a1_2); x2xor(b1,b2); d1sum(x1);d1_1sum(x1_1);d2sum(x2); s131-d1;s1_131-d1_1;s231-d2; r1(k)(s1-d1)/(s1d1);r1_1(k)(s1_1-d1_1)/(s1_1d1_1);r2(k)(s2-d2)/(s2d2); a2[a2(1,2:31),a2(1,1)];a1_2[a1_2(1,2:31),a1_2(1,1)];b2[b2(1,2:31),b2(1,1)]; end subplot(5,1,3);plot(r1);title(m1自相关波形); subplot(5,1,4);plot(r1_1);title(m2自相关波形); subplot(5,1,5);plot(r2);title(m1和m2互相关波形); %% 程序2: gold序列自相关、互相关及功率谱 m1[1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0]; m2[1 1 1 1 1 0 1 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 0 0]; %gold(1,:)bitxor(m1,m2); gold(33,:)m2; for i1:31 gold(i,:)bitxor(m1,m2); m2[m2(1,2:31),m2(1,1)]; end gold(32,:)m1; %求相关函数 a1gold(4,:);a2gold(4,:); b1gold(5,:);b2gold(5,:); c1gold(4,:);c2gold(5,:); for k1:1:31*5 x1xor(a1,a2); x2xor(b1,b2); x3xor(c1,c2); d1sum(x1);d2sum(x2);d3sum(x3); s131-d1;s231-d2;s331-d3; r1(k)(s1-d1)/(s1d1);r2(k)(s2-d2)/(s2d2);r3(k)(s3-d3)/(s3d3); a2[a2(1,2:31),a2(1,1)];b2[b2(1,2:31),b2(1,1)];c2[c2(1,2:31),c2(1,1)]; end figure; subplot(3,1,1);plot(r1);title(gold1自相关序列); subplot(3,1,2);plot(r2);title(gold2自相关序列); subplot(3,1,3);plot(r3);title(gold1与gold2的互相关序列); %gold序列功率谱 N400000; ybbfft( r1,N); magbabs(ybb); fbb(1:N/2)*100000/N; figure; plot(fbb,magb(1:N/2)*2/N); axis([20000,25180,0,0.00009]); title(gold序列功率谱); %% 实验3扩频前、扩频后曲线 figure xround(rand(1,100)); subplot(311); stem(x); title(信源信号时域波形); ts0:0.00001:3.5-0.00001; fc2000;%载波0.0005s b rectpulse(x,3500);%成型滤波矩形脉冲把每个比特拉长 3500 个点 码元Tc0.035s有70个fc bb (1-2.*b).*cos(2*pi*fc*ts); subplot(312); plot(ts,bb); axis([0,0.035,-1.2,1.2]);%1个码元 title(扩频前bpsk信号时域波形); %求m序列35050循环 x10;x20;x31; m700; for i1:m y3x3; % 暂存 x3 y2x2; % 暂存 x2 y1x1; % 暂存 x1这是输出 x3y2; % 移位x2 → x3 x2y1; % 移位x1 → x2 x1xor(y3,y1);%xor异或 反馈新 x1 老 x3 XOR 老 x1 L(i)y1; % 把输出存到 L 序列里 end %x拉长7倍700码片 N100; % tt0:349; l1:7*N; y(l)0; for i1:N k7*i-6; y(k)x(i);kk1; y(k)x(i);kk1; y(k)x(i);kk1; y(k)x(i);kk1; y(k)x(i);kk1; y(k)x(i);kk1; y(k)x(i); end %扩频信号 s(l)0; for i1:700 s(i)xor(L(i),y(i)); end subplot(3,1,3) fc2000; ts0:0.00001:3.5-0.00001;%fs100k s_brectpulse(s,500);%每个码片占350000/700个Ts0.005s s_bpsk(1-2.*s_b).*cos(2*pi*fc*ts); plot(ts,s_bpsk); xlabel(s); axis([0,0.035,-1.2,1.2]);%7个码片 title(扩频后bpsk信号时域波形); %% 程序4: 扩频前扩频后频谱 N400000; ybbfft(bb,N); magbabs(ybb); fs 1e5; fbb(1:N/2)*fs/N; figure; subplot(2,1,1) % magb(find(magbmax(magb)))3.0433e04; % magb(find(magb~max(magb)))0; %优化波形 psd magb(1:N/2)*2/(N*fs); plot(fbb,psd); axis([1200,2800,0,max(psd)*1.1]); title(未扩频信号调制前的频谱); xlabel(Hz); subplot(2,1,2) ybfft(s_bpsk,N); magabs(yb); fb(1:N/2)*fs/N; psdmag(1:N/2)*2/(N*fs); % mag(mag0.05)0.05; plot(fb,psd); %中心频率: 2kHz axis([1200,2800,0, max(psd)*1.1]); title(扩频后信号调制后的频谱); xlabel(Hz); %% 程序5扩频与未扩频BPSK在AWGN下的误码率对比 clear; clc; % 参数设置 frames 5000; % 每信噪比点发送帧数 slength 100; % 每帧比特数 EbN0_dB 0:1:10; % Eb/N0 (dB) SNR 10.^(EbN0_dB/10); % 线性信噪比 % 扩频参数与程序4一致 SF 7; % 扩频因子 % m序列生成3级寄存器反馈x3?x1初始[0 0 1] reg [0 0 1]; m_seq zeros(1, 350); for i 1:350 m_seq(i) reg(3); % 输出 new_bit xor(reg(1), reg(3)); % 反馈 reg [new_bit, reg(1:2)]; % 移位 end % 将m序列映射为±1用于扩频 pn 1 - 2*m_seq; % 0→1, 1→-1 % 预分配误码率存储 ber_sim_uns zeros(1, length(SNR)); ber_sim_spread zeros(1, length(SNR)); % 主循环 for loop 1:length(SNR) % 生成原始比特流总比特数 frames * slength data randi([0,1], 1, frames * slength); % ---------- 未扩频 BPSK 调制 ---------- bpsk_uns 1 - 2*data; % 0→1, 1→-1 % 信号功率每个符号 sig_pow mean(abs(bpsk_uns).^2); % 应该等于1 % 噪声标准差复基带但BPSK只有实部只加实噪声 sigma sqrt(sig_pow / (2 * SNR(loop))); noise_uns sigma * randn(1, length(bpsk_uns)); rx_uns bpsk_uns noise_uns; % 硬判决 rx_uns(rx_uns 0) 0; rx_uns(rx_uns 0) 1; [~, ber_sim_uns(loop)] symerr(data, rx_uns); % ---------- 扩频 BPSK 调制 ---------- % 将每个比特重复SF次 data_repeat repelem(data, SF); % 扩频重复后的比特0/1与m序列异或得到扩频后码片0/1 % 注意m_seq长度为350data_repeat长度应为350的整数倍这里100*7700但m_seq只有350需要重复或截断 % 实际每帧100比特每个比特扩为7码片共700码片。m_seq只有350需重复一次或直接截断但应保证周期性 % 简单处理将m_seq重复两次取前700码片 pn_full repmat(pn, 1, ceil(length(data_repeat)/length(pn))); pn_full pn_full(1:length(data_repeat)); % 数据比特映射为±1然后与PN相乘扩频 bpsk_spread (1 - 2*data_repeat) .* pn_full/ sqrt(SF); % 信号功率与未扩频相同因为乘了±1平均功率仍为1 noise_spread sigma * randn(1, length(bpsk_spread)); rx_spread bpsk_spread noise_spread; % ---------- 解扩相关累加---------- % 将接收信号分成每SF个码片一组与本地PN相关乘以本地PN并累加 rx_bit zeros(1, length(data)); for i 1:length(data) idx (i-1)*SF 1 : i*SF; % 相关值 sum( 接收码片 * 本地PN ) corr_val sum( rx_spread(idx) .* pn_full(idx) ); % 判决相关值 0 判为0否则判为1因为数据0映射为11映射为-1 if corr_val 0 rx_bit(i) 0; else rx_bit(i) 1; end end [~, ber_sim_spread(loop)] symerr(data, rx_bit); end % 理论误码率BPSK ber_theory qfunc(sqrt(2*SNR)); % 绘图 figure; semilogy(EbN0_dB, ber_theory, b-o, LineWidth, 1.5); hold on; semilogy(EbN0_dB, ber_sim_uns, r-s, LineWidth, 1.5); semilogy(EbN0_dB, ber_sim_spread, g-d, LineWidth, 1.5); grid on; xlabel(Eb/N0 (dB)); ylabel(误码率 (BER)); title(BPSK在AWGN信道下的误码率性能); legend(理论值 (未扩频), 仿真值 (未扩频), 仿真值 (扩频)); axis([0 10 1e-6 1e-1]);