BPSK 的时域表达式是
e B P S K ( t ) = ∑ n = − ∞ + ∞ a n h ( t − n T S ) cos ( ω c t + φ ) e_{BPSK}(t) = \sum_{n = -\infty}^{+\infty} a_nh(t-nT_S)\cos(\omega_ct+\varphi)
e B P S K ( t ) = n = − ∞ ∑ + ∞ a n h ( t − n T S ) cos ( ω c t + φ )
a n a_n a n :待发送的二进制信息
T S T_S T S :符号周期
h ( t ) h(t) h ( t ) :成型滤波器的冲激响应
ω c \omega_c ω c :载波中心频率
T S ∼ N 2 π ω c T_S\sim N\dfrac{2\pi}{\omega_c} T S ∼ N ω c 2 π :未必整数倍
MATLAB 仿真·
按照上图流程进行 MATLAB 仿真
调制与解调·
设定参数:系统时钟频率为 160 M H z 160MHz 160 M H z ,根升余弦滤波器滚降系数 α = 0.35 \alpha=0.35 α = 0.35 ,其它参数可修改
1 2 3 4 5 6 7 sys_clk = 160e6 ; Rb = 5e6 ; Rs = Rb; Ts = 1 / Rs; usmp_rate = sys_clk / Rs; fc = 20e6 ; hrc = 'rrc' ;
随机生成 num 个二进制数,并对极化处理:
1 2 3 4 num = round (100000 * 10 ^ (EbNo / 10 )); b = randi([0 1 ], 1 , num); b_sign = 1 - 2 * b;
成型滤波,并去除延迟:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 switch hrc case 'rect' h = ones (1 , usmp_rate + 1 ); case 'sinc' t = -3 * pi : pi / usmp_rate : 3 * pi ; h = sinc(t); case 'rrc' beta = 0.35 ; span = 6 ; sps = usmp_rate; h = rcosdesign(beta , span, sps, 'sqrt' ); end baseband = conv(upsample(b_sign, usmp_rate), h); delay = (length (h) - 1 ) / 2 ; baseband = baseband(delay + 1 :end - delay);
基带信号的时域波形与功率谱密度
载波调制
1 2 3 4 5 phase = 2 * pi * rand ; total_t = Ts * num; t = 0 : 1 /sys_clk : (total_t - 1 /sys_clk); carrier = cos (2 * pi * fc * t + phase); modulated_signal = baseband .* carrier;
调制信号的时域波形与功率谱密度
经过高斯白噪声信道
S N R SNR S N R 与 E b / n 0 E_b/n_0 E b / n 0 的关系:
S N R = S N = E b n 0 R b B SNR = \dfrac{S}{N} = \dfrac{E_b}{n_0}\dfrac{R_b}{B}
S N R = N S = n 0 E b B R b
1 2 SNR = EbNo - 10 * log10 (usmp_rate / 2 ); noised_signal = awgn(modulated_signal, SNR, 'measured' );
相干解调
1 2 local_carrier = 2 * carrier; received_signal = noised_signal .* local_carrier;
相干解调信号的时域波形与功率谱密度
匹配滤波与抽样判决
1 2 3 4 mf_dout = conv(received_signal, fliplr (h)); delay = (length (h) - 1 ) / 2 ; decision_result = downsample(mf_dout(delay+1 :end ), usmp_rate); decision_result = decision_result(1 :num);
匹配滤波后信号的时域波形与功率谱密度
仿真结果·
将仿真得到的误比特率曲线与理论误比特率曲线比较,基本重合
理论分析·
载波频率对误比特率的影响·
带通采样定理:
频带信号如图所示,为了保证被采样后不会发生混叠,需要满足条件:
{ − f L + m f s ≤ f L − f H + ( m + 1 ) f s ≥ f H \left\{
\begin{aligned}
&-f_L + mf_s \leq f_L\\
&-f_H + (m+1)f_s \geq f_H\\
\end{aligned}
\right.
{ − f L + m f s ≤ f L − f H + ( m + 1 ) f s ≥ f H
则
2 f H m + 1 ≤ f s ≤ 2 f L m \dfrac{2f_H}{m+1} \leq f_s \leq \dfrac{2f_L}{m}
m + 1 2 f H ≤ f s ≤ m 2 f L
在采样频率、码元速率一定时,由带通采样定理可以推导出载波频率 f c f_c f c 的范围:
2 f H m + 1 ≤ f s ≤ 2 f L m ( f H = f c + B 2 , f L = f c − B 2 ) m 2 f s + B 2 ≤ f c ≤ m + 1 2 f s − B 2 ( B = R S 2 1 + α × 2 ) m 2 f s + R S ( 1 + α ) 2 ≤ f c ≤ m + 1 2 f s − R S ( 1 + α ) 2 \begin{aligned}
&\dfrac{2f_H}{m+1} \leq f_s \leq \dfrac{2f_L}{m}\\
&(f_H = f_c + \dfrac{B}{2}, f_L = f_c - \dfrac{B}{2})\\
&\dfrac{m}{2}f_s + \dfrac{B}{2}\leq f_c \leq \dfrac{m+1}{2}f_s - \dfrac{B}{2}\\
&(B = \dfrac{R_S}{\frac{2}{1+\alpha}}\times 2)\\
&\dfrac{m}{2}f_s + \dfrac{R_S(1+\alpha)}{2}\leq f_c \leq \dfrac{m+1}{2}f_s - \dfrac{R_S(1+\alpha)}{2}\\
\end{aligned}
m + 1 2 f H ≤ f s ≤ m 2 f L ( f H = f c + 2 B , f L = f c − 2 B ) 2 m f s + 2 B ≤ f c ≤ 2 m + 1 f s − 2 B ( B = 1 + α 2 R S × 2 ) 2 m f s + 2 R S ( 1 + α ) ≤ f c ≤ 2 m + 1 f s − 2 R S ( 1 + α )
当 f s = 160 M H z , α = 0.35 , R S = 5 M H z f_s = 160MHz, \alpha=0.35, R_S = 5MHz f s = 160 M H z , α = 0.35 , R S = 5 M H z 时,可以得到 载波频率的取值范围 是
m = 0 , 3.375 < f c < 76.625 m = 1 , 83.375 < f c < 156.625 m = 2 , 163.375 < f c < 236.625 ⋯ \begin{aligned}
&m = 0, \quad 3.375 < f_c < 76.625\\
&m = 1, \quad 83.375 < f_c < 156.625\\
&m = 2, \quad 163.375 < f_c < 236.625\\
&\cdots
\end{aligned}
m = 0 , 3.375 < f c < 76.625 m = 1 , 83.375 < f c < 156.625 m = 2 , 163.375 < f c < 236.625 ⋯
内插系数对误比特率的影响·
R S ≤ 2 f c − m f s 1 + α R S ≤ ( m + 1 ) f s − 2 f c 1 + α \begin{aligned}
&R_S \leq \dfrac{2f_c - mf_s}{1+\alpha}\\
&R_S \leq \dfrac{(m+1)f_s - 2f_c}{1+\alpha}\\
\end{aligned}
R S ≤ 1 + α 2 f c − m f s R S ≤ 1 + α ( m + 1 ) f s − 2 f c
当 f s = 160 , α = 0.35 , f c = 20 f_s = 160, \alpha =0.35, f_c = 20 f s = 160 , α = 0.35 , f c = 20 时,可以得到内插系数的范围是
{ 2 f c − m f s > 0 ( m + 1 ) f s − 2 f c > 0 ⇒ m = 0 \left\{
\begin{aligned}
&2f_c - m f_s > 0\\
&(m+1)f_s - 2f_c > 0\\
\end{aligned}
\right. \Rightarrow m = 0
{ 2 f c − m f s > 0 ( m + 1 ) f s − 2 f c > 0 ⇒ m = 0
R S ≤ 40 1.35 ⇒ U s m p R a t e ≥ 5.4 R_S \leq \dfrac{40}{1.35}\Rightarrow UsmpRate\geq 5.4
R S ≤ 1.35 40 ⇒ U s m pR a t e ≥ 5.4
接收机采样点位置对误比特率的影响·
由仿真结果可以看出,在最佳的接收机采样点处采样,误比特率最低,距离该点越远,误比特率越高。
成型滤波器对误比特率的影响·
几乎无影响。
FPGA 仿真(调制)·
设定参数:系统时钟频率为 160 M H z 160MHz 160 M H z ,传输速率 R b = 5 M H z R_b=5MHz R b = 5 M H z ,发送比特数为 1024 1024 1024 位。
1 2 3 4 5 6 7 8 9 10 11 12 13 reg [14 :0 ] counter = 15'd0 ;always @(posedge clk) begin if (!rst_n) begin counter[14 :0 ] <= 13'd0 ; end else begin counter[14 :0 ] <= counter[14 :0 ] + 13'd1 ; end end wire [9 :0 ] address;assign address[9 :0 ] = counter[14 :5 ];
由系统时钟频率和传输速率可以得到内插系数为 32 32 32 ,需要 5 5 5 位计数器;发送 1024 1024 1024 位数据,需要 10 10 10 位地址,于是定义计数器变量为 reg [14:0] counter,每计数 32 32 32 ,地址增 1 1 1 ,将 counter 的高 10 10 10 位赋值给 a d d r e s s address a dd r ess .
存储数据、成型滤波、载波调制等过程通过 IP 核实现:
功能
IP 核
存储数据
Block Memory Generator
成型滤波
FIR Compiler
生成载波
DDS Compiler
载波调制
Multiplier
生成系统时钟
Clock Wizard
仿真波形如下图
噪声建模·
下文用到的符号表示:
E b E_b E b :比特能量,单位 J J J
n 0 n_0 n 0 :噪声的功率谱密度,单位 W / H z W/Hz W / H z
E b / n 0 E_b/n_0 E b / n 0 :无量纲
S S S :信号功率,单位 W W W
N N N :噪声功率,单位 W W W
B B B 带宽
S N R SNR S N R :信噪比,无量纲
R b R_b R b :比特速率,单位 b p s bps b p s ;T b T_b T b :传输每比特所需的时间
R S R_S R S :符号速率,单位 B a u d Baud B a u d
R C R_C R C :码片速率,单位 c h i p / s chip/s c hi p / s
M M M :调制星座点个数
S S R SSR S S R :扩频比
α \alpha α :根升余弦成型滤波器的滚降因子
u s m p _ r a t e usmp\_rate u s m p _ r a t e :内插系数
SNR (Signal Noise Radio)表示信噪比,E b / n 0 E_b/n_0 E b / n 0 表示传输 1 b i t 1bit 1 bi t 信息所需要的能量与噪声功率谱密度的比值。对于数字信号来说,用时间长度为 T s T_s T s 的波形表示码元,每个码元的平均功率为 0 0 0 ,因此不能用功率描述数字信号,因此采用码元能量来描述数字信号波形。
S N R = S N = E b R b n 0 B = E s R s n 0 B = E c R c n 0 B SNR = \dfrac{S}{N} = \dfrac{E_bR_b}{n_0 B} = \dfrac{E_sR_s}{n_0 B} = \dfrac{E_cR_c}{n_0 B}
S N R = N S = n 0 B E b R b = n 0 B E s R s = n 0 B E c R c
其中带宽 B = f s m p / 2 B = f_{smp} / 2 B = f s m p /2 ,比特能量与符号能量满足关系 E s = E b log 2 M E_s=E_b \log_2 M E s = E b log 2 M ,则
S N R = E s R s n 0 B = ( E b log 2 M ) ( R c / S S R ) n 0 f s m p 2 = E b n 0 ⋅ log 2 M ⋅ 2 R c f s m p ⋅ 1 S S R SNR = \dfrac{E_sR_s}{n_0 B} = \dfrac{(E_b\log_2{M})(R_c/SSR)}{n_0 \tfrac{f_{smp}}{2}} = \dfrac{E_b}{n_0} \cdot\log_2M \cdot \dfrac{2R_c}{f_{smp}} \cdot \dfrac{1}{SSR}
S N R = n 0 B E s R s = n 0 2 f s m p ( E b log 2 M ) ( R c / S S R ) = n 0 E b ⋅ log 2 M ⋅ f s m p 2 R c ⋅ S S R 1
最终得到,
[ S N R ] d B = [ E b / n 0 ] d B + [ log 2 M ] d B − [ u s m p _ r a t e 2 ] d B − [ S S R ] d B u s m p _ r a t e = f s m p / R c \begin{aligned}
[SNR] _{dB} &= [E_b/n_0]_{dB} + [\log_2{M}] _{dB} - [\dfrac{usmp\_rate}{2}]_{dB} - [SSR]_{dB}\\
usmp\_rate &= f_{smp} / R_c
\end{aligned}
[ S N R ] d B u s m p _ r a t e = [ E b / n 0 ] d B + [ log 2 M ] d B − [ 2 u s m p _ r a t e ] d B − [ S S R ] d B = f s m p / R c
注:
在常规通信系统中,u s m p _ r a t e usmp\_rate u s m p _ r a t e 是仿真中的采样速率与 符号速率 之比;
在扩频通信系统中,u s m p _ r a t e usmp\_rate u s m p _ r a t e 是仿真中的采样速率与 码片速率 之比;
BPSK 的 MATLAB 仿真·
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 close all; clear; clc; tic; fs = 122.88e6 ; Rs = 3.072e6 ; Rb = Rs; Ts = 1 / Rs; fc = 2e9 ; usmp_rate = floor (fs / Rs); num = 5000 ; b = 1 - 2 * randi([0 1 ], 1 , num); beta = 0.1 ; span = 12 ;sps = usmp_rate; h = rcosdesign(beta , span, sps, "sqrt" ); baseband_tx = conv(upsample(b, usmp_rate), h, "same" ); toc; t = (1 : length (baseband_tx)) / fs; carrier = cos (2 * pi * fc * t); tx_wave = baseband_tx .* carrier; toc; Ebn0_dB = 10 ; SNR_dB = Ebn0_dB - 10 * log10 (usmp_rate / 2 ); rx_wave = awgn(tx_wave, SNR_dB, 'measured' ); toc; local_carrier = 2 * carrier; demod_wave = rx_wave .* local_carrier; baseband_rx = conv(demod_wave, h, "same" ); samples = baseband_rx(1 : sps : end ); bits_recovered = double(samples < 0 ); toc; original_bits = (b < 0 ); err = sum(original_bits(1 :num) ~= bits_recovered(1 :num)); fprintf('Bit error rate: %d\n' , err / num); N = 65536 ; t = (1 : length (baseband_tx)) / fs; figure ;subplot(2 , 1 , 1 ); plot (t, baseband_tx);xlabel("Time (s)" ); ylabel("Amplitude" ); title("BPSK Baseband Signal" ); grid on; subplot(2 , 1 , 2 ); f = (-fs/2 : fs/N : fs/2 -fs/N); plot (f, 10 * log10 (abs (fftshift(fft(baseband_tx, N)))));xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("BPSK Baseband Spectrum" ); grid on; figure ;subplot(2 , 2 , 1 ); plot (t, demod_wave);xlabel("Time (s)" ); ylabel("Amplitude" ); title("Coherent Demodulation Signal" ); grid on; subplot(2 , 2 , 2 ); plot (t, baseband_rx);xlabel("Time (s)" ); ylabel("Amplitude" ); title("Matched Filtering Signal" ); grid on; subplot(2 , 2 , 3 ); f = (-fs/2 : fs/N : fs/2 -fs/N); plot (f, 10 * log10 (abs (fftshift(fft(demod_wave, N)))));xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("Coherent Demodulation Spectrum" ); grid on; subplot(2 , 2 , 4 ); f = (-fs/2 : fs/N : fs/2 -fs/N); plot (f, 10 * log10 (abs (fftshift(fft(baseband_rx, N)))));xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("Matched Filtering Spectrum" ); grid on; figure ;subplot(2 , 1 , 1 ); plot (original_bits(1 :100 ));hold on;stem(original_bits(1 :100 ), "r" , "LineStyle" , "none" , "Marker" , "o" ); title('Original Bits (First 100)' ); subplot(2 , 1 , 2 ); plot (bits_recovered(1 :100 ));hold on;stem(bits_recovered(1 :100 ), "r" , "LineStyle" , "none" , "Marker" , "o" ); title('Recovered Bits (First 100)' );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 close all; clear; clc; if gpuDeviceCount > 0 gpuDevice(1 ); fprintf('Using GPU: %s\n' , gpuDevice().Name); else error('No GPU detected!' ); end tic; fs = 122.88e6 ; Rs = 3.072e6 ; Rb = Rs; Ts = 1 / Rs; usmp_rate = floor (fs / Rs); num = 10000000 ; b = gpuArray(1 - 2 * randi([0 1 ], 1 , num)); beta = 0.1 ; span = 12 ;sps = usmp_rate; h = gpuArray(rcosdesign(beta , span, sps, "sqrt" )); baseband_tx = conv(upsample(b, usmp_rate), h, "same" ); toc; Ebn0_dB = 10 ; SNR_dB = Ebn0_dB - 10 * log10 (usmp_rate / 2 ); signal_power = mean (abs (baseband_tx).^2 ); noise_power = signal_power / (10 ^(SNR_dB/10 )); noise = sqrt (noise_power) * randn (size (baseband_tx), 'gpuArray' ); rx_wave = baseband_tx + noise; toc; baseband_rx = conv(rx_wave, h, "same" ); samples = baseband_rx(1 : sps : end ); bits_recovered = double(samples < 0 ); toc; original_bits = (b < 0 ); bits_recovered = gather(bits_recovered); baseband_tx = gather(baseband_tx); baseband_rx = gather(baseband_rx); err = sum(original_bits(1 :num) ~= bits_recovered(1 :num)); fprintf('Bit error rate: %d\n' , err / num); N = 65536 ; t = (1 : length (baseband_tx)) / fs; figure ;subplot(2 , 1 , 1 ); plot (t, baseband_tx);xlabel("Time (s)" ); ylabel("Amplitude" ); title("BPSK Baseband Signal" ); grid on; subplot(2 , 1 , 2 ); f = (-fs/2 : fs/N : fs/2 -fs/N); plot (f, 10 * log10 (abs (fftshift(fft(baseband_tx, N)))));xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("BPSK Baseband Spectrum" ); grid on; figure ;subplot(2 , 1 , 1 ); plot (t, baseband_rx);xlabel("Time (s)" ); ylabel("Amplitude" ); title("Matched Filtering Signal" ); grid on; subplot(2 , 1 , 2 ); f = (-fs/2 : fs/N : fs/2 -fs/N); plot (f, 10 * log10 (abs (fftshift(fft(baseband_rx, N)))));xlabel("Frequency (Hz)" ); ylabel("Amplitude (dB)" ); title("Matched Filtering Spectrum" ); grid on; figure ;subplot(2 , 1 , 1 ); plot (original_bits(1 :100 ));hold on;stem(original_bits(1 :100 ), "r" , "LineStyle" , "none" , "Marker" , "o" ); title('Original Bits (First 100)' ); subplot(2 , 1 , 2 ); plot (bits_recovered(1 :100 ));hold on;stem(bits_recovered(1 :100 ), "r" , "LineStyle" , "none" , "Marker" , "o" ); title('Recovered Bits (First 100)' );
参考资料·
讨论
评论