當前位置:首頁 » 編程軟體 » 信道編解碼ber性能模擬

信道編解碼ber性能模擬

發布時間: 2022-04-24 06:21:53

1. 基於MATLAB的循環碼編譯碼器的模擬

fa,shou,caina

2. 編寫m文件,完成BPSK調制在AWGN信道下的性能模擬

我知道 我就不告訴你

3. 自己寫的信道編碼的程序,SNR在0到6誤碼率越來越小,但是6以後反倒是隨著SNR的增大BER也越大。

要注意這兩個都是帶引號的,是字元串,這是matlab自帶函數中常用的給定參數SNR,'fsk',M,1,'coherent');%這個表示相關檢測估計應該就可以解決你這個d
拿去把 信道估計,有BER曲線

clear all;
close all;
fprintf( '\n OFDM模擬\n \n') ;
% --------------------------------------------- %
% 參數定義 %
% --------------------------------------------- %
IFFT_bin_length = 1024;
carrier_count = 200;
bits_per_symbol = 2;
symbols_per_carrier = 50;
% 子載波數 200
% 位數/ 符號 2
% 符號數/ 載波 50
% 訓練符號數 10
% 循環前綴長度 T/4(作者註明) All-zero CP
% 調制方式 QDPSK
% 多徑信道數 2、3、4(預設)
% 信道最大時延 7 (單位數據符號)
% 模擬條件 收發之間嚴格同步
%SNR=input('SNR='); % 輸入信噪比參數
SNR=3:14;%定義信噪比范圍
BER=zeros(1,length(SNR));
baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;% 計算發送的二進制序列長度
carriers = (1: carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_count/2)); % 坐標: (1 to 200) + 156 , 157 -- 356
conjugate_carriers=IFFT_bin_length-carriers+2; % 坐標 :1024 - (157:356) + 2 = 1026 - (157:356) = (869:670)
% 構造共軛時間-載波矩陣,以便應用所謂的RCC,Reced Computational Complexity演算法,即ifft之後結果為實數
% Define the conjugate time-carrier matrix
% 也可以用flipdim函數構造對稱共軛矩陣
% --------------------------------------------- %
% 信號發射 %
% --------------------------------------------- %
%out = rand(1,baseband_out_length);
%baseband_out1 = round(out) ;
%baseband_out2 = floor(out*2) ;
%baseband_out3 = ceil(out*2)-1 ;
%baseband_out4 = randint(1,baseband_out_length);
% 四種生成發送的二進制序列的方法,任取一種產生要發送的二進制序列
%if (baseband_out1 == baseband_out2 & baseband_out1 == baseband_out3 )
% fprintf('Transmission Sequence Generated \n \n');
% baseband_out = baseband_out1 ;
%else
% fprintf('Check Code!!!!!!!!!!!!!!!!!!!!! \n \n');
%end
% 驗證四種生成發送的二進制序列的方法
baseband_out=round( rand(1,baseband_out_length));
convert_matrix = reshape(baseband_out,bits_per_symbol,length(baseband_out)/bits_per_symbol);
for k = 1length(baseband_out)/bits_per_symbol),
molo_baseband(k) = 0;
for i = 1:bits_per_symbol
molo_baseband(k) = molo_baseband(k) + convert_matrix(i,k)* 2^(bits_per_symbol - i);
end
end
% 每2個比特轉化為整數 0至3
% 採用'left-msb'方式
%-------------------------------------------------------------------------
% Test by lavabin
% A built-in function of directly change binary bits into decimal numbers
%-------------------------------------------------------------------------
%convert_matrix1 = zeros(length(baseband_out)/bits_per_symbol,bits_per_symbol);
%convert_matrix1 = convert_matrix' ;
%Test_convert_matrix1 = bi2de(convert_matrix1,bits_per_symbol,'left-msb');
%Test_convert_matrix2 = bi2de(convert_matrix1,bits_per_symbol,'right-msb');
% 函數說明:
% BI2DE Convert binary vectors to decimal numbers.
% D = BI2DE(B) converts a binary vector B to a decimal value D. When B is
% a matrix, the conversion is performed row-wise and the output D is a
% column vector of decimal values. The default orientation of thebinary
% input is Right-MSB; the first element in B represents the least significant bit.
%if (molo_baseband == Test_convert_matrix1')
% fprintf('molo_baseband = Test_convert_matrix1 \n\n\n');
%else if (molo_baseband == Test_convert_matrix2')
% fprintf('molo_baseband = Test_convert_matrix2 \n\n\n');
% else
% fprintf('molo_baseband ~= any Test_convert_matrix \n\n\n');
% end
%end
% we get the result "molo_baseband = Test_convert_matrix1".
%-------------------------------------------------------------------------
carrier_matrix = reshape(molo_baseband,carrier_count,symbols_per_carrier)';
% 生成時間-載波矩陣
% --------------------------------------------- %
% QDPSK調制 %
% --------------------------------------------- %
carrier_matrix = [zeros(1,carrier_count); carrier_matrix]; % 添加一個差分調制的初始相位,為0
for i = 2symbols_per_carrier + 1)
carrier_matrix(i, = rem(carrier_matrix(i, + carrier_matrix (i-1,, 2^bits_per_symbol) ; % 差分調制
end
carrier_matrix = carrier_matrix*((2*pi)/(2^bits_per_symbol)) ; % 產生差分相位
[X, Y]=pol2cart(carrier_matrix, ones(size(carrier_matrix,1),size(carrier_matrix,2))); % 由極坐標向復數坐標轉化 第一參數為相位 第二參數為幅度
% Carrier_matrix contains all the phase information and all the amplitudes are the same『1』.
complex_carrier_matrix = complex(X, Y) ;
% 添加訓練序列 `
training_symbols = [ 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 ...
-j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 ...
1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 ...
-1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j ...
-1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 ]; % 25 times "1 j j 1" , 25 times "-1 -j -j -1", totally 200 symbols as a row
training_symbols = cat(1, training_symbols, training_symbols) ;
training_symbols = cat(1, training_symbols, training_symbols) ; % Proction of 4 rows of training_symbols
complex_carrier_matrix = cat(1, training_symbols, complex_carrier_matrix) ; % 訓練序列與數據合並
% block-type pilot symbols
IFFT_molation = zeros(4 + symbols_per_carrier + 1,IFFT_bin_length) ;
% Here a row vector of zeros is between training symbols and data symbols!!! 
% 4 training symbols and 1 zero symbol
% every OFDM symbol takes a row of "IFFT_molation"
IFFT_molation(: , carriers) = complex_carrier_matrix;
IFFT_molation(: , conjugate_carriers) = conj(complex_carrier_matrix) ;
%-------------------------------------------------------------------------
% Test by lavabin -- Find the indices of zeros
%index_of_zeros = zeros(symbols_per_carrier,IFFT_bin_length - 2*carrier_count);
%IFFT_molation1 = zeros(4 + symbols_per_carrier + 1,IFFT_bin_length);
%IFFT_molation2 = zeros(4 + symbols_per_carrier + 1,IFFT_bin_length);
%IFFT_molation1(6:symbols_per_carrier+5, = IFFT_molation(6:symbols_per_carrier+5,==0 ;
%for i = 1:symbols_per_carrier
%index_of_zeros(i, = find(IFFT_molation1(i+5,==1);
%end
%-------------------------------------------------------------------------
time_wave_matrix = ifft(IFFT_molation') ; % 進行IFFT操作
time_wave_matrix = time_wave_matrix'; % If X is a matrix, ifft returns the inverse Fourier transform of each column of the matrix.
for i = 1: 4 + symbols_per_carrier + 1
windowed_time_wave_matrix( i, : ) = real(time_wave_matrix( i, : )) ;
end
% get the real part of the result of IFFT
% 這一步可以省略,因為IFFT結果都是實數
% 由此可以看出,只是取了IFFT之後載波上的點,並未進行CP的復制和添加end
ofdm_molation = reshape(windowed_time_wave_matrix',1, IFFT_bin_length*(4 + symbols_per_carrier + 1) ) ;
% P2S operation
%-------------------------------------------------------------------------
% Test by lavabin
% Another way of matrix transition
%ofdm_molation_tmp = windowed_time_wave_matrix.';
%ofdm_molation_test = ofdm_molation_tmp(';
%if (ofdm_molation_test == ofdm_molation)
% fprintf('ofdm_molation_test == ofdm_molation \n\n\n');
%else
%fprintf('ofdm_molation_test ~= ofdm_molation \n\n\n');
%end
% We get the result "ofdm_molation_test == ofdm_molation" .
%-------------------------------------------------------------------------
Tx_data=ofdm_molation;
% --------------------------------------------- %
% 信道模擬 %
% --------------------------------------------- %
d1= 4; a1 = 0.2; d2 = 5; a2 = 0.3; d3 = 6; a3 = 0.4; d4 = 7; a4 = 0.5; %信道模擬
1 = zeros(size(Tx_data)) ;
for i = 1 + d1: length(Tx_data)
1(i) = a1*Tx_data( i - d1) ;
end
2 = zeros(size(Tx_data) ) ;
for i = 1 + d2: length( Tx_data)
2(i) = a2*Tx_data( i - d2) ;
end
3 = zeros(size(Tx_data) ) ;
for i = 1 + d3: length(Tx_data)
3(i) = a3*Tx_data ( i - d3) ;
end
4 = zeros(size(Tx_data) ) ;
for i = 1 + d4: length( Tx_data)
4(i) = a4*Tx_data(i - d4) ;
end
Tx_data = Tx_data + 1 + 2 + 3 + 4; % 4 multi-paths
Tx_signal_power = var(Tx_data);
for idx=1:length(SNR)%monte carlo 模擬模擬

linear_SNR = 10^( SNR(idx) /10) ;
noise_sigma = Tx_signal_power / linear_SNR;
noise_scale_factor = sqrt(noise_sigma) ;
noise = randn(1, length(Tx_data) )*noise_scale_factor;
Rx_Data = Tx_data + noise;
% --------------------------------------------- %
% 信號接收 %
% --------------------------------------------- %
Rx_Data_matrix = reshape(Rx_Data, IFFT_bin_length, 4 + symbols_per_carrier + 1) ;
Rx_spectrum = fft(Rx_Data_matrix) ;
% Suppose precise synchronazition between Tx and Rx
Rx_carriers = Rx_spectrum( carriers, : )';
Rx_training_symbols = Rx_carriers( (1: 4) , : ) ;
Rx_carriers = Rx_carriers((5: 55), : ) ;
% --------------------------------------------- %
% 信道估計 %
% --------------------------------------------- %

Rx_training_symbols = Rx_training_symbols./ training_symbols;
Rx_training_symbols_deno = Rx_training_symbols.^2;
Rx_training_symbols_deno = Rx_training_symbols_deno(1,+Rx_training_symbols_deno(2,+Rx_training_symbols_deno(3,+Rx_training_symbols_deno(4, ;
Rx_training_symbols_nume = Rx_training_symbols(1, : ) +Rx_training_symbols(2, : ) + Rx_training_symbols(3, : ) +Rx_training_symbols(4, : ) ;
Rx_training_symbols_nume = conj(Rx_training_symbols_nume) ;
% 取4個向量的導頻符號是為了進行平均優化
% 都是針對 「行向量」即單個的OFDM符號 進行操作
% 原理:尋求1/H,對FFT之後的數據進行頻域補償
% 1/H = conj(H)/H^2 because H^2 = H * conj(H)
Rx_training_symbols = Rx_training_symbols_nume./Rx_training_symbols_deno;
Rx_training_symbols = Rx_training_symbols_nume./Rx_training_symbols_deno;
Rx_training_symbols_2 = cat(1, Rx_training_symbols,Rx_training_symbols) ;
Rx_training_symbols_4 = cat(1, Rx_training_symbols_2,Rx_training_symbols_2) ;
Rx_training_symbols_8 = cat(1, Rx_training_symbols_4,Rx_training_symbols_4) ;
Rx_training_symbols_16 = cat(1, Rx_training_symbols_8, Rx_training_symbols_8) ;
Rx_training_symbols_32 = cat(1, Rx_training_symbols_16, Rx_training_symbols_16) ;
Rx_training_symbols_48 = cat(1, Rx_training_symbols_32, Rx_training_symbols_16) ;
Rx_training_symbols_50 = cat(1, Rx_training_symbols_48, Rx_training_symbols_2) ;
Rx_training_symbols = cat(1, Rx_training_symbols_50,Rx_training_symbols) ;
Rx_carriers = Rx_training_symbols.*Rx_carriers; % 進行頻域單抽頭均衡
Rx_phase = angle(Rx_carriers)*(180/pi) ;
phase_negative = find(Rx_phase < 0) ;
%----------------------Test of Using "rem"---------------------------------
%Rx_phase1 = Rx_phase;
%Rx_phase2 = Rx_phase;
%Rx_phase1(phase_negative) = rem(Rx_phase1(phase_negative) + 360, 360) ;
%Rx_phase2(phase_negative) = Rx_phase2(phase_negative) + 360 ;
%if Rx_phase2(phase_negative) == Rx_phase1(phase_negative)
%fprintf('\n There is no need using rem in negative phase transition.\n')
%else
% fprintf('\n We need to use rem in negative phase transition.\n')
%end
%-------------------------------------------------------------------------
Rx_phase(phase_negative) = rem(Rx_phase(phase_negative) + 360, 360) ; % 把負的相位轉化為正的相位
Rx_decoded_phase = diff(Rx_phase) ;
% 這也是為什麼要在前面加上初始相位的原因
% 「Here a row vector of zeros is between training symbols and data symbols!!!」
phase_negative = find(Rx_decoded_phase < 0) ;
Rx_decoded_phase(phase_negative)= rem(Rx_decoded_phase(phase_negative) + 360, 360) ; % 再次把負的相位轉化為正的相位
% --------------------------------------------- %
% QDPSK解調 %
% --------------------------------------------- %
base_phase = 360 /2^bits_per_symbol;
delta_phase = base_phase /2;
Rx_decoded_symbols = zeros(size(Rx_decoded_phase,1),size(Rx_decoded_phase,2)) ;
for i = 1: (2^bits_per_symbol - 1)
center_phase = base_phase*i;
plus_delta = center_phase + delta_phase; % Decision threshold 1
minus_delta = center_phase - delta_phase; % Decision threshold 2
decoded = find((Rx_decoded_phase <= plus_delta)&(Rx_decoded_phase > minus_delta)) ;
Rx_decoded_symbols(decoded) = i;
end
% 僅僅對三個區域進行判決
% 剩下的區域就是零相位的空間了
% 這個區域在定義解調矩陣時已經定義為零
Rx_serial_symbols = reshape(Rx_decoded_symbols',1,size(Rx_decoded_symbols, 1)*size(Rx_decoded_symbols,2)) ;
for i = bits_per_symbol: -1: 1
if i ~= 1
Rx_binary_matrix(i, : ) = rem(Rx_serial_symbols, 2) ;
Rx_serial_symbols = floor(Rx_serial_symbols/2) ;
else
Rx_binary_matrix( i, : ) = Rx_serial_symbols;
end
end
% Integer to binary
baseband_in = reshape(Rx_binary_matrix, 1,size(Rx_binary_matrix, 1)*size(Rx_binary_matrix, 2) ) ;
% --------------------------------------------- %
% 誤碼率計算 %
% --------------------------------------------- %
%bit_errors(idx) = find(baseband_in ~= baseband_out) ;
% find的結果 其每個元素為滿足邏輯條件的輸入向量的標號,其向量長度也就是收發不一樣的bit的個數
%bit_error_count(idx) = size(bit_errors, 2) ;
%total_bits = size( baseband_out, 2) ;
%bit_error_rate = bit_error_count/ total_bits;
%fprintf ( '%f \n',bit_error_rate) ;
[number_err(idx),BER(idx)] = biterr(baseband_out,baseband_in ) ;
end
semilogy(SNR,BER,'r*');

legend('OFDM BER-SNR');
xlabel('SNR (dB)'); ylabel('BER');
title('OFDM');
grid on;
% --------------------------------------------- %
% The END %
% --------------------------------------------- %
%
% 1. 該程序進行了簡單的LMS信道估計,沒有加入與MMSE等其他信道估計演算法的比較;
%
%2. 模擬條件為系統處於理想同步情況下。

4. 簡述實際應用中的信道編碼技術

信道編碼
通過信道編碼器和解碼器實現的用於提高信道可靠性的理論和方法。資訊理論的內容之一。信道編碼大致分為兩類 :
①信道編碼定理,從理論上解決理想編碼器、解碼器的存在性問題,也就是解決信道能傳送的最大信息率的可能性和超過這個最大值時的傳輸問題。
②構造性的編碼方法以及這些方法能達到的性能界限。

5. BPSK信號通過AWGN信道的誤碼性能分析的模擬實驗

signal=random(1,1000);%1000是數據長度,自己隨便改
for i=1:length(signal)
if i<=0
bpsk_signal(i)=-1;
else bpsk_signal(i)=1;
end;
signal_after_channel=awgn(signal,10);%10是信噪比,自己隨便改

ber=0;
for i=1:length(signal_after_channel)
if signal_after_channel(i)~=bpsk_signal(i)
ber=ber+1;
end;

eyediagram(signal_after_channel,2);

有誤碼率和眼圖了,還要什麼?
額,看了分多,還是回答下吧,真是的!

可能有鄙陋的地方,請你用help命令參照著改改

6. 什麼叫信道解碼

信號在發送之前,為了抵抗各種衰落造成的誤碼,要將信號進行信道編碼,在接收端,就要進行相應的信道解碼來恢復原來的信號。

7. 通信模擬中鏈路級模擬和系統級模擬分別指的是什麼,他們的評價指標都有哪些

鏈路級模擬與系統級模擬的區別 2010-09-09 21:45:49| 分類: 學術|舉報|字型大小 訂閱鏈路級模擬主要是檢驗各種RTT技術方案的性能.根據無線傳輸技術物理層的基本模塊和相關演算法,並通過適當的信道建模,建立一條點到點的無線鏈路.通過模擬計算,得到基本的BER和Eb/No的關系.鏈路級模擬的平台包括:發射機模塊/信道模型/接收機模塊以及功率控制同步模塊構成.發射機模塊的作用是產生用戶的數據流,並對數據流進行編碼,調制,交織,以及擴頻等物理層操作,發射機發出的信號經過無線信道到達接收端,再進行與發射模塊相反的處理.將接收到的信息與原始信息進行比較,從而得到系統的誤碼率.與鏈路級模擬關注的是點到點的鏈路不同,系統級模擬關注的對象是整個系統內的多條鏈路.系統級模擬的目的是根據鏈路級模擬的結果,檢驗系統級的特性(如系統容量/掉話率/阻塞率等指標),各類RRM演算法的性能也是通過系統級模擬平台來驗證的.系統級模擬又分為:靜態模擬和動態模擬.靜態模擬(Monte Carlo模擬)是採用快照(snapshot)的方式,對系統狀態進行多次抓拍,將所有snapshot的結果進行記錄,用統計的方法對系統性能進行分析.一般用靜態模擬來評估系統的實時業務容量大小,以及評估不同系統之間的互干擾.動態模擬是模擬真實環境中用戶和系統的各種行為,如用戶的起呼,掉話,用戶的運動速度,運動方向,以及系統方面的切換和性能計算等.在這些動態行為的基礎上計算出所需要的結果.動態模擬用於評估各類RRM演算法的性能,並且可以用於模擬數據業務的吞吐量等,可為實際系統的網路規劃和優化提供指導,對實際網路中各類RRM模塊的參數設置提供理論依據.

8. 信道與編碼若干實驗題(要求用C語言編寫)~求高手

嵌入式軟體一般需著重考慮三個方面:性能、安全性和開發效率(包括代碼可移植性等)。
性能(運行效率)方面,匯編明顯是最高的。但匯編在安全性和開發效率方面明顯是最低的(不考慮機器語言- -)。所以除非是要求極端高性能的嵌入式平台(或者是系統實在是太簡單而沒辦法支持高級語言,orz- -),使用匯編語言的不多。
相對於C,其它高級語言的運行效率一般比較低(C程序運行效率可達匯編的80%,而其它程序可能只有C程序的80%),源代碼和目標代碼也可能會比較長。對於嵌入式系統,性能的瓶頸是非常致命的,很可能某種用C編寫的程序可以達到預期目標,而用其它語言使用同樣演算法編寫的程序就不行。(不過也正因為這個原因,在嵌入式系統上實現的可用編程語言並不多。)
基於系統的用途,安全性設計嵌入式系統也是必須考慮的一個部分(比如說用於醫療衛生設施),必須盡可能在開發期間減少潛在的錯誤。這方面C不佔優勢,但如果保證代碼嚴格遵守安全規范,也可以接受(相對而言,匯編就郁悶了- -)。
開發效率和安全性類似,也在可接受范圍之內。

9. 信源編碼和信道編碼的作用是什麼

1、信源編碼

(1)作用之一是,即通常所說的數據壓縮

(2)作用之二是將信源的模擬信號轉化成數字信號,以實現模擬信號的數字化傳輸。

2、信道編碼

(1)數字信號在傳輸中往往由於各種原因,使得在傳送的數據流中產生誤碼,從而使接收端產生圖象跳躍、不連續、出現馬賽克等現象。所以通過信道編碼這一環節,對數碼流進行相應的處理,

使系統具有一定的糾錯能力和抗干擾能力,可極大地避免碼流傳送中誤碼的發生。誤碼的處理技術有糾錯、交織、線性內插等。

(2)糾錯編碼

數字電視中常用的糾錯編碼,通常採用兩次附加糾錯碼的前向糾錯(FEC)編碼。RS編碼屬於第一個FEC,188位元組後附加16位元組RS碼,構成(204,188)RS碼,這也可以稱為外編碼。

第二個附加糾錯碼的FEC一般採用卷積編碼,又稱為內編碼。外編碼和內編碼結合一起,稱之為級聯編碼。級聯編碼後得到的數據流再按規定的調制方式對載頻進行調制。

糾錯碼的各種類型

1、RS編碼

RS碼即里德-所羅門碼,它是能夠糾正多個錯誤的糾錯碼,RS碼為(204,188,t=8),其中t是可抗長度位元組數,對應的188符號,監督段為16位元組(開銷位元組段)。

實際中實施(255,239,t=8)的RS編碼,即在204位元組(包括同步位元組)前添加51個全「0」位元組,產生RS碼後丟棄前面51個空位元組,形成截短的(204,188)RS碼。RS的編碼效率是:188/204。

2、卷積碼

卷積碼非常適用於糾正隨機錯誤,但是,解碼演算法本身的特性卻是:如果在解碼過程中發生錯誤,解碼器可能會導致突發性錯誤。為此在卷積碼的上部採用RS碼塊,RS碼適用於檢測和校正那些由解碼器產生的突發性錯誤。所以卷積碼和RS碼結合在一起可以起到相互補償的作用。

熱點內容
隨機啟動腳本 發布:2025-07-05 16:10:30 瀏覽:516
微博資料庫設計 發布:2025-07-05 15:30:55 瀏覽:19
linux485 發布:2025-07-05 14:38:28 瀏覽:299
php用的軟體 發布:2025-07-05 14:06:22 瀏覽:751
沒有許可權訪問計算機 發布:2025-07-05 13:29:11 瀏覽:425
javaweb開發教程視頻教程 發布:2025-07-05 13:24:41 瀏覽:687
康師傅控流腳本破解 發布:2025-07-05 13:17:27 瀏覽:234
java的開發流程 發布:2025-07-05 12:45:11 瀏覽:679
怎麼看內存卡配置 發布:2025-07-05 12:29:19 瀏覽:277
訪問學者英文個人簡歷 發布:2025-07-05 12:29:17 瀏覽:828