程序1: m1、m2序列以及自相关、互相关
程序2:gold序列自相关、互相关及功率谱
实验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时域波形'); %求相关函数 a1=m1;a2=m1; a1_1=m2;a1_2=m2; b1=m1;b2=m2; for k=1:1:31*5 x1=xor(a1,a2);x1_1=xor(a1_1,a1_2); x2=xor(b1,b2); d1=sum(x1);d1_1=sum(x1_1);d2=sum(x2); s1=31-d1;s1_1=31-d1_1;s2=31-d2; r1(k)=(s1-d1)/(s1+d1);r1_1(k)=(s1_1-d1_1)/(s1_1+d1_1);r2(k)=(s2-d2)/(s2+d2); 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 i=1:31 gold(i,:)=bitxor(m1,m2); m2=[m2(1,2:31),m2(1,1)]; end gold(32,:)=m1; %求相关函数 a1=gold(4,:);a2=gold(4,:); b1=gold(5,:);b2=gold(5,:); c1=gold(4,:);c2=gold(5,:); for k=1:1:31*5 x1=xor(a1,a2); x2=xor(b1,b2); x3=xor(c1,c2); d1=sum(x1);d2=sum(x2);d3=sum(x3); s1=31-d1;s2=31-d2;s3=31-d3; r1(k)=(s1-d1)/(s1+d1);r2(k)=(s2-d2)/(s2+d2);r3(k)=(s3-d3)/(s3+d3); 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序列功率谱 N=400000; ybb=fft( r1,N); magb=abs(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 x=round(rand(1,100)); subplot(311); stem(x); title('信源信号时域波形'); ts=0:0.00001:3.5-0.00001; fc=2000;%载波0.0005s b= rectpulse(x,3500);%成型滤波(矩形脉冲)把每个比特拉长 3500 个点 码元Tc=0.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序列350,50循环 x1=0;x2=0;x3=1; m=700; for i=1:m y3=x3; % 暂存 x3 y2=x2; % 暂存 x2 y1=x1; % 暂存 x1(这是输出) x3=y2; % 移位:x2 → x3 x2=y1; % 移位:x1 → x2 x1=xor(y3,y1);%xor异或 反馈:新 x1 = 老 x3 XOR 老 x1 L(i)=y1; % 把输出存到 L 序列里 end %x拉长7倍,700码片 N=100; % tt=0:349; l=1:7*N; y(l)=0; for i=1:N k=7*i-6; y(k)=x(i);k=k+1; y(k)=x(i);k=k+1; y(k)=x(i);k=k+1; y(k)=x(i);k=k+1; y(k)=x(i);k=k+1; y(k)=x(i);k=k+1; y(k)=x(i); end %扩频信号 s(l)=0; for i=1:700 s(i)=xor(L(i),y(i)); end subplot(3,1,3) fc=2000; ts=0:0.00001:3.5-0.00001;%fs=100k s_b=rectpulse(s,500);%每个码片占350000/700个Ts,0.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: 扩频前扩频后频谱 N=400000; ybb=fft(bb,N); magb=abs(ybb); fs = 1e5; fbb=(1:N/2)*fs/N; figure; subplot(2,1,1) % magb(find(magb==max(magb)))=3.0433e+04; % 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) yb=fft(s_bpsk,N); mag=abs(yb); fb=(1:N/2)*fs/N; psd=mag(1:N/2)*2/(N*fs); % mag(mag>0.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长度为350,data_repeat长度应为350的整数倍(这里100*7=700,但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映射为1,1映射为-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]);