Thực hiện mã LDPC

Một phần của tài liệu mã hóa nguồn phân tán sử dụng mã LDPC trong mạng cảm biến không dây (Trang 49 - 69)

Với việc mã hóa LDPC chúng ta tạo các ma trận kiểm tra lỗi chẵn-lẻ lớn hơn và mật độ thấp hơn. Theo định lý mã hóa nguồn của Shannon thì việc mã hóa trong trường hợp chiều dài khối lớn hơn cho hiệu năng tốt hơn, và tạo ra nhiều ma trận lớn hơn. Ma trận kiểm tra lỗi H được xây dựng ngẫu nhiên. Các từ mã đã lượng tử nhiều hơn trong chiều dài khối đạt được (ví dụ là103) và nhân với ma trận H như là trong ví dụ về mã Hamming. Các bít mã hóa đại diện cho 1 khối các chuỗi bít của coset và được gửi qua kênh truyền để giải mã và khôi phục dữ liệu.

Bộ giải mã sử dụng một phiên bản đáp thích hợp của thuật toán sum-product được miêu tả ở chương 4.2 trong đó sự quyết định không chỉ dựa trên chuỗi bít nhận được và rang buộc về kiểm tra chẵn lẻ trong biểu đồ Tanner mà còn quan tâm đến chuỗi các bít tương quan của thông tin biên Y. Do hạn chế về mặt thời gian nên nó không được thực hiện và kiểm tra.

1 2 3 4 5 6 7 8 9 10 11 12 10-10 10-8 10-6 10-4 10-2

BIT and BLOCK Detection for (7,4) Hamming Code

SNR(dB)

BER

Simulated BER(Hard Decoding) Simulated BER(Soft Decoding) Theoritical BER(Hard DEcoding) Theoritical BER(Soft Decoding)

50 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54

Hình 4.2.2 Kết quả tỷ lệ bít lỗi mã hóa LDPC qua kênh AWGN 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 10-2.69 10-2.67 10-2.65 10-2.63 10-2.61

51 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54 KẾT LUẬN CHUNG

Mục đích chính của việc nghiên cứu này là sử dụng một nền tảng mã hóa thông minh để tăng thời gian sống của sensor trong mạng cảm biến không dây. Các sensor này phải hoạt động mà không phải cấp thêm nguồn và quan trọng hơn cả là cần giảm khối lượng dữ liệu mà mỗi sensor sẽ phải truyền. Mã hóa nguồn phân tán cho thấy kết quả mong muốn nếu thực hiện chính xác. Chúng ta miêu tả cách nén dữ liệu dựa trên sự tương quan với các nguồn khác mà không cần thiết phải thành lập mạng liên kết cảm biến (intersensor).

Như việc thực hành chúng ta đã sử dụng mã LDPC để nén dữ liệu. Mã hóa LDPC được biết đến như là một dạng của mã hóa kênh và vẫn đang cải tiến và càng gần hơn với giói hạn Shannon. Khi sử dụng mã hóa nguồn phân tán cho thấy hiệu năng tốt hơn so với mã turbo và đạt được giới hạn Slepian-Wolf. Trong đò án này, chúng ta chỉ kiểm tra về mặt lý thuyết với một mã Hamming(7,4) như là bộ mã hóa phân tán. Nó cho thấy hiệu năng không được tốt lắm, nhưng ní như là một bức tranh tổng thể về kỹ thuật, triển khai, và sử dụng trong mô hình mã hóa nguồn phân tán.

Thử minh họa lý thuyết của đồ án trong môi trường thực tế, chúng ta sử dụng mã hóa nguồn phân tán trong mạng của các nút cảm biến y tế đo đạc các tín hiệu ECG trong cơ thể người. Đây chỉ là phần trong việc thực hiện nén dữ liệu dựa trên sự tương quan trong mạng cảm biến, nhưng có thể là một phần tất yếu trong việc làm giảm năng lượng tiêu thụ và vì thế sẽ tăng thời gian sống cho sensor.

Hướng phát triển đề tài :

Do khả năng còn hạn chế, cộng với việc thời gian không kịp đáp ứng, em mới chỉ dừng lại ở mức nghiên cứu và mô phỏng các thuật toán áp dụng vào Mã nguồn phân tán. Chính vì vậy, hướng nghiên cứu sắp tới của em sẽ là nghiên cứu cách đưa được các thuật toán này vào mạng cảm biến không dây như theo yêu cầu. Đồng thời có thể sử dụng mô phỏng này đưa vào phần cứng thực tế để kiểm chứng độ chính xác và góp phần ứng dụng vào thực tế.

52 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54 PHỤ LỤC

1. Thuyết biến dạng tốc độ

Khi xem xét các nguồn tương tự, không đủ để giải mã các tổn hao vì sự giới hạn công suất của một kênh thực. Thay vì có sự biến dạng không kiểm soát được từ các kênh chúng tôi có thể giới thiệu một sự suy thoái được kiểm soát nhất định hoặc biến dạng tín hiệu trước khi truyền. Tiếng ồn nhiều hơn trên các kênh có sẵn, chúng ta càng phải tăng biến dạng này, hay nói cách khác: giảm tỷ lệ nguồn. Một ví dụ đơn giản nhưng trực quan của kết quả này được thể hiện trong hình 1.

D

R

Hình 1 : Hình ảnh điển hình của chức năng bóp méo tỉ lệ

Chức năng bóp méo tỷ lệ cho chúng ta giới hạn lý thuyết cho tốt như thế nào chúng ta có thể làm tổn hao nén với số liệu biến dạng nói chung và nguồn chung. Tỷ lệ chung chức năng biến dạng méo dự kiến :

d ≤ D

53 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54

R(D) = { }

{ }

= { } ( )

= { } ( ) ⁄

Với yi là các đầu ra, p = p (xn, ym ) và P là ma trận kênh. Chức năng bóp méo tỷ lệ là khó có thể tìm ra cho các nguồn chung và các số liệu biến dạng, nhưng có thể được phân loại trường hợp đặc biệt. Cho một nguồn gaussian ít nhớ với kỳ vọng bình phương méo số liệu σ2N = D và công suất đầu vào σ2 X có chức năng méo tỉ lệ bằng R(D) = (σ ) Từ điều này ta có thể giải quyết và nhận được tính năng tốc độ biến dạng : D(R) = σ

Do đó lựa chọn tốc độ một sự đánh đổi- tắt trên một chấp nhận lượng biến dạng thành các tín hiệu hoặc do hạn chế nhất định (ví dụ như hạn chế công suất, tiếng ồn kênh).

Lý thuyết biến dạng tỷ lệ mô tả được sử dụng trong các ví dụ thực tế thông qua các hình thức khác nhau của lượng tử, một số phức tạp hơn so với những thành phần khác.

1.1. Sự lượng tử hóa vô hướng

Sự lượng tử hóa vô hướng được hoàn thành dựa trên một ví dụ về nguồn tại một thời điểm. Điều này có thể được ước lượng hay tối ưu cho sự phân tán của nguồn. Một cách để tối ưu là dựa vào thuật toán Lloy – Max tổng quát. Việc thiết kế lượng tử tối ưu đạt được thông qua việc tìm ra sự thay đổi lỗi lượng tử hóa nhỏ nhất

qua từng trạng thái.

54 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54

với n = 1, . . . , N – 1

Với rn là số mức đại diện, dn là số mức quyết định và N là số mức lượng tử hóa. Các trạng thái này được làm sáng tỏ qua 2 công thức :

( ) với n = 1, . . . , N – 1

∫ ( )

∫ ( ) với n = 0, . . . , N – 1

được giải quyết bằng cách lặp đi lặp lại từ một số giá trị ban đầu. Công thức 6 chỉ ra rằng trong lượng tử tối ưu hóa mức độ đại diện đươc cho là trọng tâm của khoảng thời gian quyết định tương ứng, và các mức quyết định đặt chính giữa hai mức đại diện. Các đặc trưng lượng tử hóa sẽ có các khoảng thời gian quyết định lớn nơi xác suất xảy ra của tín hiệu đầu vào là nhỏ, và ngược lại. Đây là cách mà mức lượng tử hóa sẽ đóng góp với số lượng tương tự để hạn chế tối đa các lỗi lượng tử.

1.2. Sự lượng tử hóa Vector có hướng

Sự lượng tử hóa có hướng được đưa ra, như chính tên gọi, trên một vector của các ví dụ. Khi sự lượng tử hóa được hoàn thành với nhiều hơn một ví dụ, các mức quyết định trở nên đa chiều hay đa vùng hơn, và tín hiệu được lượng tử để trở thành điểm đại diện của một vùng. Mức đại diện được quyết định dựa trên N giá trị liên tục của tín hiệu đầu vào. Nếu các vùng là Voronoi ( hoặc các phần Dirichlet ) và các mức đại diện là các trung tâm của các vùng tương ứng, sự lượng tử hóa được tối ưu.

Các vector đại diện định dạng cho codebook của lượng tử hóa một vector. Chỉ số từ mã kích hoạt được truyền trên kênh và được tái cấu trúc đầy hứa hẹn trên mặt bên phía nhận. Codebook thường được thiết kế qua việc thử nghiệm của VQ. Có nghĩa là, đầu ra của ta đưa ra một dãy bit tuần tự xác định được ta giả sử giống như một nguồn VQ tiềm tàng sẽ được dùng, và chúng ta tìm ra codebook bằng các thuật toán lặp.

55 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54

Các tương quan khác theo thời gian một nguồn là, các dạng VQ tốt hơn. Sự lượng tử hóa vector có thể được chỉ ra để cung cấp độ méo tín hiệu có tỉ lệ thấp nhất cho một mức độ nén được đưa ra. Tuy nhiên, do số chiều cao và kích thước codebook lớn, nó yêu cầu nó dẫn đến phức tạp tính toán cao và sự chậm trễ và không thực tế [19, 20].

1.3. Sự lượng tử hóa lồng nhau

Ở phép lượng tử hóa lồng nhau, chúng ta có hai phép lượng tử hóa với tỷ lệ lồng khác nhau của từng loại. Điều này chỉ ra đây là một code chuẩn hay code không chuẩn. Code không chuẩn có thể được xem như là một bước cấu trúc tập hợp; ban đầu lượng tử hóa sử dụng code chuẩn, sau đó sử dụng code không chuẩn để đặt từ mã trong một tập hợp.

Lịch trình lượng tử hóa lồng nhau có thể ddwwocj twhcj hiện cho bất kì các nguồn ví dụ bị chặn lại, có nghĩa là nó có thể được cáu trúc trong bất kì hướng nào. Nếu cả hai loại code nằm trong không gian hai chiều thì chúng ta có thể gọi nó là

lượng tử hóa mạng lưới đan xen. Điều này trở nên giống với lượng tử hóa vector, và việc tối ưu của các vùng Voronoi là một chức năng được thiết kế cốt yếu. Trong không gian hai chiều, cấu trúc tối ưu được tìm ra để hình thành lưới lục giác.

2. Các câu lệnh cơ bản trong MATLAB

Khi khởi động MATLAB, chương trình sẽ hiển thị lên một cửa sổ lệnh cho phép bạn soạn thảo những dòng lệnh với cấu trúc “>> dòng lệnh”. Các bạn có thể thấy một chương trình giải quyết bài toán tìm nghiệm thực của phương trình bậc 2 như sau:

function giaiptbac2() >>a = input('a = '); >>b = input('b = '); >>c = input('c = ');

56 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54

>>d = b*b-4*a*c >>if d < 0

>>k = 'phuong trinh vo nghiem' >>elseif d == 0 >>x1 = -b/(2 * a) >>x2 = x1 >>else >>x1 = (-b + sqrt(d))/(2 * a) >>x2 = (-b - sqrt(d))/(2 * a) >>end

Thuật toán và các câu lệnh cũng tương tự như các ngôn ngữ lập trình C, C++ bởi MATLAB là một loại hợp ngữ. Dưới đây là một ví dụ >> c = [1:2:7; 8:2:14; 20:-1:17] c = 1 3 5 7 8 10 12 14 20 19 18 17 * Tạo vector cột d từ ma trận c : d=c( :)

57 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54 >> d = c(:) d =8 20 10 19 12 18

* Ma trận chuyển vị dùng kí hiệu nháy đơn “ '

>> c1 = c' c1 = 8 20 10 19 12 18 * Ma trận có các phần tử là 1 : ones(r,c) r số hàng, c số cột >> ones(3,4) ans = 1 1 1 1 1 1 1 1 1 1 1 1

Ma trận là một dạng của mảng dữ liệu. Các phép toán với ma trận và mảng được MATLAB hỗ trợ bằng command window help chọn operation được hiển thị trên giao diện khởi động của MATLAB. Như vậy bạn có thể thực hiện mọi yêu cầu của bài toán. Một chú ý nho nhỏ khi thực hiện phép nhân trong ma trận, MATLAB

58 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54

phân biệt nhân từng phần từ của ma trận bằng kí hiệu “ .* “ còn nhân 2 ma trận là kí tự “ *”.

Ngoài ra, một điều khác biệt trong MATLAB với các ngôn ngữ lập trình hướng đối tượng khác là ở cách sử dụng dấu chấm phẩy. Dấu “;” đặt ở cuối câu lệnh mặc định khi câu lệnh thực hiện xong sẽ không hiển thị kết quả. Còn nếu không có thì mặc định kết quả được hiển thị.

Ngoài phương pháp gõ lệnh trực tiếp ở cửa sổ chương trình, MATLAB còn hỗ trợ tạo một script m-file chứa các câu lệnh gõ ở cửa sổ lệnh, các câu lệnh này cũng thực thi giống như ở cửa sổ lệnh.

Cách tạo m-file:

Menu File => New =>Script

Ví dụ, bạn tạo một file vidu.m, sau khi hoàn thành những câu lệnh trong m- file, bạn lưu và trở lại cửa sổ chương trình viết dòng lệnh >> vidu. Sau đó các câu lệnh trong file sẽ được thực hiện, kết quả sẽ được hiển thị.

Chú ý rằng, MATLAB sẽ không thực hiện được chương trình nếu như đường dẫn của m-file (matlabpath) không chính xác. Như vậy, một yêu cầu bắt buộc người viết code phải đảm bảo chính xác tuyệt đối đường dẫn của m-file khi thực hiện chương trình.

3. Code sử dụng trong đồ án : 3.1. Code Hamming :

close all;clear all;clc;

SNRdB=1:1:12; %SNR in dB

SNR=10.^(SNRdB./10); %SNR in linear scale

info_word_length=1000; %No. of information words

59 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54

ber=zeros(length(SNR),2); %Simulated BER

info_word=floor(2*rand(k,info_word_length)); %Generation of 0 and 1 for infromation bits

code_bit5=xor(info_word(1,:),xor(info_word(2,:),info_word(3,:))); %First Parity Bit

code_bit6=xor(info_word(1,:),xor(info_word(3,:),info_word(4,:))); %Second Parity Bit

code_bit7=xor(info_word(1,:),xor(info_word(2,:),info_word(4,:))); %Third Parity Bit

code_word=[info_word;code_bit5;code_bit6;code_bit7]; %Coded information Word with parity bits

code_word(code_word==0)=-1; %Converting 0 bits to 1

decoded_bit=zeros(n,info_word_length); %HARD Decoding Output

decoded_block=zeros(n,info_word_length); %SOFT Decoding Output

H=[1 1 1;1 0 1;1 1 0;0 1 1;1 0 0;0 1 0;0 0 1]; %Parity Check Matrix

C=de2bi((0:2^(k)-1)); %All bits of length k(Stored in valid code words matrix 'C')

C(1:16,5)=xor(C(:,1),xor(C(:,2),C(:,3))); %First Parity Bit

C(1:16,6)=xor(C(:,1),xor(C(:,3),C(:,4))); %Second Parity Bit

C(1:16,7)=xor(C(:,1),xor(C(:,2),C(:,4))); %Third Parity Bit

distance=zeros(1,2^k);

for i=1:length(SNR)

y=(sqrt(SNR(i))*code_word)+randn(n,info_word_length); %Received Codes

%For BIT(Hard) Detection

decoded_bit(y>0)=1; %All positive received bits converted to +1

60 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54

%Decoding Received Codes into valid codewords

for l=1:info_word_length %HARD Decoding

hi= decoded_bit(:,l)'*H; %Syndrome Detection

for j=1:n %Matching 'hi' to every row vector of H and flipping the corresponding bit of 'z' using xor

if (hi==H(j,:))

decoded_bit(j,l)=~decoded_bit(j,l); %NOT operation on the corresponding bit

end

end

%SOFT Decoding

for m=1:(k^2) %Tacking distance of each column of the received word to a valid codeword

distance(m)=norm(y(:,l)-C(m,:)'); end

[minval,minind]=min(distance); %Finding index of the minimum distance valid codeword

decoded_block(:,l)=C(minind,:); %Decoding as the min distance codewor

end

ber(i,1)=length(find(decoded_bit(1:4,:)~=info_word)); %BER in BIT Detection

ber(i,2)=length(find(decoded_block(1:4,:)~=info_word)); %BER in BLOCK Detection

end

ber=ber/(k*info_word_length);

semilogy(SNRdB,ber(:,1),'r-<','linewidth',2.0) %Simulated BER in HARD decoding

61 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54

semilogy(SNRdB,ber(:,2),'m-<','linewidth',2.0) %Simulated BER in SOFT Decoding hold on p=qfunc(sqrt(SNR)); BER_HARD=zeros(1,length(SNR)); for j=2:n BER_HARD=BER_HARD+nchoosek(n,j).*(p.^j).*((1-p).^(n-j)); end

semilogy(SNRdB,BER_HARD,'k-','linewidth',2.0); %Theroritical BER in HARD decoding

hold on

BER_SOFT=(7.*qfunc(sqrt(3*SNR)))+(7.*qfunc(sqrt(4*SNR)))+(qfunc(sqrt(7*SN R)));

semilogy(SNRdB,BER_SOFT,'b-','linewidth',2.0) %Theoritical BER in SOFT decoding

title('BIT and BLOCK Detection for (7,4) Hamming Code');xlabel('SNR(dB)');ylabel('BER');

legend('Simulated BER(Hard Decoding)','Simulated BER(Soft

Decoding)','Theoritical BER(Hard DEcoding)','Theoritical BER(Soft Decoding)'); axis tight

grid

3.2. Code Turbo ( chưa hoàn thiện ) :

close all;clear all;clc;

N=1E4; %Block length

X=floor(2*rand(1,N)); %Information bit generation

Interleaver=randperm(N); %Interleaver(random permutation of first N integers)

62 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54

SNR=10.^(SNRdB/10); %SNR in linear scale

Iteration=4;

ber=zeros(length(SNR),Iteration); %Simulated BER(Each column corresponds to one iteration)

%% Encoding

X_pi(1:N)=X(Interleaver(1:N)); %Interleaving input bits for RSC-1 encoder

C0=zeros(1,N); %Code Bit for encoder RSC-0

C1=zeros(1,N); %Code Bit for encoder RSC-1 for i=1:N

k = i;

while (k >= 1)

C0(i) = xor ( C0(i),X(k) ); C1(i) = xor ( C1(i),X_pi(k) ); k=k-2; end end P0 = xor (X,[0,C0(1:end-1)]); P1 = xor (X_pi,[0,C1(1:end-1)]);

Input_matrix=2*[0,1;0,1;0,1;0,1]-1; %First column represents input=0 and second column represents input=1

%Each row represents state 00,10,01 and 11 respectively

Parity_bit_matrix=2*[0,1;1,0;0,1;1,0]-1; %Parity bits corresponding to inputs of above matrix

mod_code_bit0=2*X-1; %Modulating Code Bits using BPSK Modulation

mod_code_bit1=2*P0-1; mod_code_bit2=2*P1-1; dlg = ProgressDialog(); dlg.FractionComplete = 0;

63 | Sinh viên thực hiện : Hoàng Thanh Tùng– Điện Tử 1-K54

dlg.StatusMessage = sprintf('Encoding completed...');

%% Decoding

for k = 1:length(SNR) %Simulation starts here

R0=sqrt(SNR(k))*mod_code_bit0+randn(1,N); % Received Codebits Corresponding to input bits

R1=sqrt(SNR(k))*mod_code_bit1+randn(1,N); % Received Codebits Corresponding to parity bits of RSC-0

R2=sqrt(SNR(k))*mod_code_bit2+randn(1,N); % Received Codebits Corresponding to parity bits of RSC-1

R0_pi(1:N)=R0(Interleaver(1:N)); %Interleaving received codebits corresponding to input bits to be used by RSC-1

BCJR=0; %First iteration will be done by BCJR-0

Một phần của tài liệu mã hóa nguồn phân tán sử dụng mã LDPC trong mạng cảm biến không dây (Trang 49 - 69)

Tải bản đầy đủ (PDF)

(69 trang)