Matlab實現單 雙 極性 不 歸零碼

2022-08-01 12:21:13 字數 3679 閱讀 9041

首先需要確定單個碼元訊號,以一秒為乙個碼元週期,每次取樣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)];

endend

然後觀察波形看是否正確

%% 繪製出結果

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];

endend%% 繪製出結果

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%。以01時間段為例,圖一的訊號一直都是1,這是不歸零的訊號,圖二在00.5時為1,0.5~1時為0,也就是在下乙個碼元來臨前回歸零,這是歸零訊號的特性。而兩者訊號的功率譜密度顯示,在0頻率處能量最集中,各個平墊的能量分布較為均衡,向兩極逐漸遞減,這適應於乙個隨機訊號的特性

雙極性歸零訊號和單極性不歸零訊號及其功率譜密度:

分析:雙極性訊號不歸零訊號只有1 -1 兩種幅值,而歸零訊號則多乙個0幅值。由於與單極性訊號相比,只是幅值上面有所差異,對於頻域的沒有太大的影響,因而其功率譜密度也是十分相似的

matlab 單雙精度引發的血案

今天在測試乙個演算法時遇到了少見的問題,覺得值得記錄,總結起來,可以用下面幾行 來表示 看到了麼,這個數字在加減去1後都是不變的,然而,當bbb不是單精度時,答案就是正確的 當然,在互動行中直接賦值的變數預設是double型別。這麼寫只是為了強調資料的格式。matlab在用雙精度減 或加 單精度型別...

c 實現單 雙鏈表

單鏈表 include using namespace std typedef int datatype struct slistnode 在c 中結構體也就是乙個類 typedef slistnode node class slist slist const slist s head null t...

golang實現單 雙鏈表

go實現乙個單鏈表 儲存內容為int 該鍊錶提供以下方法 1 建立鍊錶 2 在鍊錶頭部插入乙個節點 3 返回鍊錶元素個數 4 列印鍊錶所有的元素 type node struct type list struct func newlist list func this list add data i...