Matlab實現單(雙)極性(不)歸零碼
內容大綱
- Matlab實現單極性不歸零波形(NRZ),0 1 幅值
- Matlab實現單極性歸零波形(RZ),0 1 幅值
- Matlab實現雙極性不歸零波形,-1 1 幅值
- Matlab實現雙極性歸零波形, -1 1 幅值
設計
首先需要確定單個碼元信號,以一秒為一個碼元周期,每次采樣128個點得到兩個碼元信號,分別是RZ信號和NRZ信號
%% 生成單個碼元
Ts = 1; % 碼元周期
N_sample = 128; % 單個碼元抽樣點數
dt = Ts / N_sample; % 抽樣時間間隔
N = 100; % 碼元數
t = 0 : dt : (N * N_sample - 1) * dt; % 序列傳輸時間
gt1 = ones(1, N_sample); % NRZ
gt2 = [ones(1, N_sample / 2), zeros(1, N_sample / 2)]; % RZ
然后根據碼元數生成N個0 1 的隨機序列,然后根據隨機序列在1時取一個碼元信號,隨機序列為0時取一個零信號
%% 生成隨機序列
RAN = round(rand(1, N)); % 隨機0 1序列
se1 = [];
se2 = [];
for i = 1 : N % 生成序列
if RAN(i)==1
se1 = [se1 gt1];
se2 = [se2 gt2];
else
se1 = [se1 zeros(1, N_sample)];
se2 = [se2 zeros(1, N_sample)];
end
end
然后觀察波形看是否正確
%% 繪制出結果
subplot(2, 1, 1);plot(t, se1);grid on;axis([0 20 0 2]);title('NRZ');
subplot(2, 1, 2);plot(t, se2);grid on;axis([0 20 0 2]);title('RZ');
求信號的功率譜,功率譜 = 信號的頻率的絕對平方 / 傳輸序列的持續時間, 求得的功率譜進行單位換算以dB值表示
%% 功率譜密度計算
fft_se1 = fftshift(fft(se1)); % 求序列的頻譜
fft_se2 = fftshift(fft(se2));
PE1 = 10 * log10(abs(fft_se1) .^ 2 / (N * Ts)); % 公式法求概率譜密度
PE2 = 10 * log10(abs(fft_se2) .^ 2 / (N * Ts));
PEL1 = (-length(fft_se1) / 2 : length(fft_se1) / 2 - 1) / 10; % 求區間長度
PEL2 = (-length(fft_se2) / 2 : length(fft_se2) / 2 - 1) / 10;
注意:這里使最終觀察的波形易於觀察,需要使用fftshift函數使0頻率響應移到頻域中心,而頻域較寬,因此只觀察整個頻域的1/10,取中心部位觀察
觀察功率譜是否正確
%% 繪制出結果
subplot(2, 2, 1);plot(t, se1);grid on;axis([0 20 -1.5 1.5]);title('DBNRZ');
subplot(2, 2, 2);plot(t, se2);grid on;axis([0 20 -1.5 1.5]);title('DBRZ');
把單極性轉化為雙極性觀察:此處與單極性不同的地方在於,生成序列的時候,隨機序列為0時取單個碼元信號的乘以-1,而不是取0信號
此處以附上雙極性的全部代碼(與單極性差別不大)
clear all
close all
clc
%% 生成單個碼元
Ts = 1; % 碼元周期
N_sample = 128; % 單個碼元抽樣點數
dt = Ts / N_sample; % 抽樣時間間隔
N = 100; % 碼元數
t = 0 : dt : (N * N_sample - 1) * dt; % 序列傳輸時間
gt1 = ones(1, N_sample); % NRZ
gt2 = [ones(1, N_sample / 2), zeros(1, N_sample / 2)]; % RZ
%% 生成隨機序列
RAN = round(rand(1, N)); % 隨機0 1序列
se1 = [];
se2 = [];
for i = 1 : N % 生成序列
if RAN(i)==1
se1 = [se1 gt1];
se2 = [se2 gt2];
else
se1 = [se1 -1*gt1];
se2 = [se2 -1*gt2];
end
end
%% 繪制出結果
subplot(2, 2, 1);plot(t, se1);grid on;axis([0 20 -1.5 1.5]);title('DBNRZ');
subplot(2, 2, 2);plot(t, se2);grid on;axis([0 20 -1.5 1.5]);title('DBRZ');
%% 功率譜密度計算
fft_se1 = fftshift(fft(se1)); % 求序列的頻譜
fft_se2 = fftshift(fft(se2));
PE1 = 10 * log10(abs(fft_se1) .^ 2 / (N * Ts)); % 公式法求概率譜密度
PE2 = 10 * log10(abs(fft_se2) .^ 2 / (N * Ts));
PEL1 = (-length(fft_se1) / 2 : length(fft_se1) / 2 - 1) / 10; % 求區間長度
PEL2 = (-length(fft_se2) / 2 : length(fft_se2) / 2 - 1) / 10;
%% 繪制出結果
subplot(2, 2, 3);plot(PEL1, PE1); grid on; axis([-50 50 -50 50]); title('density-DBNRZ');
subplot(2, 2, 4);plot(PEL2, PE1); grid on; axis([-50 50 -50 50]); title('density-DBRZ');
運行效果
單極性歸零信號和單極性不歸零信號及其功率譜密度:
分析:單個碼元信號的周期是1,圖中很坐標以2顯示一個點,實際為1。占空比的設置為50%。以0~1時間段為例,圖一的信號一直都是1,這是不歸零的信號,圖二在0~0.5時為1,0.5~1時為0,也就是在下一個碼元來臨前回歸零,這是歸零信號的特性。而兩者信號的功率譜密度顯示,在0頻率處能量最集中,各個平墊的能量分布較為均衡,向兩極逐漸遞減,這適應於一個隨機信號的特性
雙極性歸零信號和單極性不歸零信號及其功率譜密度:
分析:雙極性信號不歸零信號只有1 -1 兩種幅值,而歸零信號則多一個0幅值。由於與單極性信號相比,只是幅值上面有所差異,對於頻域的沒有太大的影響,因而其功率譜密度也是十分相似的
后記
關於單(雙)極性(不)歸零編碼的應用看了網上一篇博客:多路復用技術、頻分多路復用、時分多路復用、波分多路復用、碼分多址、空分多址,講得還不錯。貼網址: