Mã hóa, truyền và giải mã tín hiệu âm thanh thời gian thực trên matlab

  • Số trang: 17 |
  • Loại file: DOCX |
  • Lượt xem: 551 |
  • Lượt tải: 0
nhattuvisu

Đã đăng 26946 tài liệu

Mô tả:

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ - VIỄN THÔNG BÁO CÁO BÀI TẬP LỚN MÔN XỬ LÝ SỐ TÍN HIỆU Đề tài: Mã hóa, truyền và giải mã tín hiệu âm thanh thời gian thực trên Matlab Sinh viên thực hiện: Phan Thu Trang 20109648 Đinh Văn Nhâm 20109345 Nguyêễn Đức Minh 20109587 Giảng viên hướng dẫn : Thầy Dương Tấn Nghĩa Hà nội, 5-2013 Mục lục I. Giới thiệu đêề tài:..................................................................................................................................3 II. Nội dung bài tập lớn............................................................................................................................3 Khốối 1:Nén tn hiệu..............................................................................................................................5 Khốối 2:Lượng tử hóa tn hiệu...............................................................................................................6 Khốối 3:Integer to Bit Converter............................................................................................................8 Khốối 4:Mã chập....................................................................................................................................8 Khốối 5: Điêều chêố QPSK.........................................................................................................................9 Khốối 6:Kênh truyêền cộng nhiêễu AWGN (ADDITIVE WHITE GAUSSIAN NOISE )....................................10 Khốối 7: Giải điêều chêố QPSK.................................................................................................................12 Khốối 8:Giải mã mã chập.....................................................................................................................12 Khốối 9: Giải mã Bit to Integer Converter............................................................................................13 Khốối 10 : Giải mã lượng tử hóa DPCM...............................................................................................13 Khốối 11: Giãn tn hiệu........................................................................................................................14 Khảo sát tỷ lệ lốễi bit trong đường truyêền...........................................................................................14 III. KẾẾT LUẬN.......................................................................................................................................17 IV. TÀI LIỆU THAM KHẢO:....................................................................................................................17 2 I. Giới thiệu đềề tài: Ngày nay,cùng với sự phát triển của ngành cống nghệ vi đi ện t ử và máy tnh thì ứng d ụng c ủa X Ử LÝ SỐẾ TÍN HIỆU(Digital Signal Processing ) đã trở thành một trong nh ững ứng d ụng c ơ b ản và ph ổ biêốn cho kyễ thuật mạch tch hợp hiện đại váo các vi xử lý có thể l ập trình và ho ạt đ ộng ở tốốc d ọ cao. Xử lý tn hiệu sốố có hai mảng chính đó là x ử lý tn hi ệu âm thanh và x ử lý ảnh.trong đó x ử lý âm thanh được phổ biêốn trong cuộc sốống hiện đại râốt ph ổ biêốn.nh ững ứng d ụng có th ể k ể t ơi đó là:nh ận di ện giọng nói,biêốn văn bản thành giọng nói,x ử lý âm thanh trong âm nh ạc … Chính vì lý do đó nhóm em đã chọn đêề tài cho bài t ập l ớn: Mã hóa, truyền và giải mã tín hiệu âm thanh thời gian thực Matlab. Nhóm em xin gửi lời cảm ơn đến thầy Dương Tấn Nghĩa đã trực tiếp hướng dẫn, giúp đỡ chúng em hoàn thành bài báo cáo này. II. Nội dung bài tập lớn Đề tài: Mã hóa, truyền và giải mã tín hiệu âm thanh thời gian thực Matlab Sơ đồ khối của quá trình thực hiện: Tổng quan: Do tín hiệu âm thanh thu được trên máy tính đã được lấy mẫu với chu kỳ lấy mẫu cho trước nên ta bỏ qua khối lấy mẫu. 3 Tín hiệu sau khi lượng tử hóa được các chỉ số Index và Quant_out. Mã hóa các Index bằng bộ mã hóa Integer to Bit Converter, sau đó cho các bít nhị phân đi qua bộ mã hóa bằng mã chập (Convolutional Encoder) với tốc độ R = ½ nghĩa là số bít ra gấp 2 lần số bit đầu vào. Tiếp tục điều chế QPSK tín hiệu trước khi đưa lên kênh truyền cộng nhiễu AWGN Channel. Thực hiện giả mã lần lượt QPSK, mã chập, mã nhị phân là lượng tử hóa ta sẽ được tín hiệu tín hiệu có được tín hiệu bên thu. Sử dụng các lệnh sau để đọc vào 1 file âm thanh wav: [filename,pathname]=uigetfile('*.wav'); [signal Srate nBits] = wavread([pathname,filename]); signal là một ma trận lưu dữ liệu âm thanh; nếu wav-file là mono thì signal là vector cột, còn stereo thì nó là ma trận có 2 cột. Srate là tốc độ lấy mẫu của file này. nBits là số bit dùng để lưu một mẫu dữ liệu. filename đưa vào là file road.wav đi kèm. Khảo sát tín hiệu đưa vào: Mp = max(signal); bits = 8;%Dùng 8 bit để mã hóa 1 mẫu levels = 2^bits;%So mau 8 bit mã hóa được step_size = (2*Mp)/levels;%Bước nhảy cho mỗi khoảng codebook = [-Mp+step_size:step_size:Mp]; % Số đại diện cho mỗi khoảng trong phần %partition partition = [-Mp+2*step_size:step_size:Mp] %Chia tín hiệu thành 256 khoảng %Chia tín hiệu thành các frame, mỗi frame có chứa 1024 mẫu frame = reshape(signal,1024,length(signal)/1024); %frame là một ma trận có 1024 hàng và length(signal)/1024 cột k = length(signal)/1024; 4 Khốối 1:Nén tín hiệu Trong các ứng dụng xửlý tín hiệu thoại (speech processing), trước khi lượng tửhoá, người ta thường thực hiện nén (compress) tín hiệu theo hàm logarithm, mục đích là đểtín hiệu ởmức biên độnhỏsẽthay đổi nhiều mức hơn so với ởcác giá trịbiên độlớn, do đó sai sốlượng tửtương đối ởcác mức biên độnhỏvà lớn sẽkhông chênh lệch nhau nhiều như đối với trường hợp không nén. Đểkhôi phục lại đúng tín hiệu ban đầu thì sau khi giải mã, ta phải đưa qua một bộ giãn tín hiệu (expander) có đặc tuyến truyền đạt là nghịch đảo của đặc tuyến của bộnén (compressor). Sựkết hợp của bộnén và bộgiãn tín hiệu gọi chung là bộnén giãn tín hiệu (compander). Hai luật nén giãn thường được sửdụng trong xửlý tín hiệu thoại là luật μdùng ởBắc Mỹvà luật A dùng ởchâu Âu: y  ymax ln[1   ( x / xmax )] ln(1   ) sgn x Luật µ : Theo các chuẩn ởBắc Mỹ, giá trịcủa μ là 255. Max x và Max y lần lượt là các giá trị dương lớn nhất của x và y. Luật A: � A( x / xmax ) y sngx � � max 1  ln A y� �y 1  ln[ A( x / xmax )] sgn x � max � 1  ln A � x 1 0 � � � xmax A � �1  x �1 �A x max � nếu với A là hắng số Giá trịchuẩn của A là 87.6 MATLAB cung cấp hàm compand để thực hiện nén giãn tín hiệu. Hàm này hỗ trợ hai luật nén giãn A và μ nói trên. >> out = compand(in, param, v, method) Inlà tín hiệu vào còn outlà tín hiệu ra v là biên độ đỉnh của tín hiệu vào paramlà thông sốcủa luật nén giãn (hằng sốA hoặc μ) methodcó thểnhận một trong các giá trịsau: 5 Code Matlab: function sig_comp = compressor(sig_t) %Nen tin hieu truoc khi dua vao khoi luong tu hoá %sig_t la tin hieu dua vao %Su dung nen theo luat A voi he so A = 86.7 A = 87.6; V = max(sig_t); sig_comp = compand(sig_t,A,V,'A/compressor'); end Khốối 2:Lượng tử hóa tín hiệu Lượng tửhoá là quá trình rời rạc hoá tín hiệu vềmặt biên độ, cụthểlà thay thếtất cả các giá trịcủa tín hiệu nằm trong một khoảng xác định nào đó thành một giá trịduy nhất. Miền giá trịcủa tín hiệu được chia thành một sốhữu hạn các khoảng chia. Nhưvậy, độlớn của tín hiệu sau khi lượng tửchỉcó thểnhận một trong sốhữu hạn các giá trịcho trước. Tập hợp các khoảng chia gọi là sựphân hoạch của tín hiệu (partition). Tập các giá trịthay thếcho mỗi khoảng chia gọi là bộmã (codebook). MATLAB biểu diễn phân hoạch của tín hiệu bằng một vector mà các phần tửcủa nó là các điểm ranh giới giữa hai khoảng chia liên tiếp. Ví dụ, nếu tín hiệu có miền xác định là R, được phân hoạch thành các khoảng (-∞, 0], (0,2], (2,4] và (4,+∞) thì có thểbiểu diễn sựphân hoạch này bằng vector: >>partition = [0,2,4]; Tương ứng với vector phân hoạch tín hiệu là vector biểu diễn bộmã tín hiệu. Các phần tửcủa nó là các giá trịthay thếtrong mỗi khoảng chia tương ứng của phân hoạch. Nếu ta thay thếcác giá trịtrong khoảng (-∞, 0] bằng -1, các giá trịtrong khoảng (0,2] bằng 1, các giá trị trong khoảng (2,4] bằng 3 và các giá trịtrong khoảng (4, +∞] bằng 5 thì vector biểu diễn bộmã sẽlà: >> codebook = [-1,1,3,5]; 6 Nhưtrên đã đềcập, thông thường người ta sẽphân hoạch miền xác định của tín hiệu thành 2^v khoảng, sau đó mỗi khoảng tín hiệu sẽ được lượng tửhoá, sau đó mã hoá bằng một từ mã nhịphân có chiều dài v bit. Phương pháp lượng tửhoá này được gọi là phương pháp điều mã xung (Pulse Code Modulation). Phương pháp này không cần đòi hỏi bất kỳthông tin nào vềtín hiệu ởcác thời điểm trước đó. Trong thực tế, vì tín hiệu thường thay đổi chậm từthời điểm lấy mẫu này sang thời điểm lấy mẫu kếtiếp nên nếu ta thực hiện lượng tử và mã hoá các giá trịsai biệt giữa thời điểm hiện tại với thời điểm trước đó thì sẽtốn ít giá trịhơn so với mã hoá đầy đủ độlớn của tín hiệu. Trên cơsởnày, ta có một phương pháp lượng tửhoá mới, gọi là lượng tửhoá tiên đoán, trong đó giá trịcủa tín hiệu ởthời điểm hiện tại sẽ được tính thông qua một sốcác giá trịcủa tín hiệu ởcác thời điểm quá khứ. Tiêu biểu cho loại lượng tử hoá này là kỹthuật điều mã xung vi sai (DPCM – Differential Pulse Code Modulation). Đểthực hiện mã hoá DPCM, ta không những phải xác định sựphân hoạch và bộmã lượng tửmà còn phải xác định hàm dự đoán, đểdự đoán giá trịcủa tín hiệu ởthời điểm hiện tại. Thông thường, người ta sửdụng hàm dự đoán tuyến tính: y(k) = p(1)x(k-1) + p(2)x(k-2) + ... + p(m-1)x(k-m+1) + p(m)x(k-m) (14.1) trong đó x là tín hiệu gốc còn y(k) là giá trịdự đoán của x(k); p là một vector gồm các hằng sốthực. Thay vì lượng tửhoá tín hiệu x, ta sẽthực hiện lượng tửhoá tín hiệu sai sốdự đoány – x. m được gọi là bậc dự đoán. Trường hợp đặc biệt m = 1 được gọi là điều chếdelta. Trong MATLAB Communications Toolbox, hàm dự đoán được sửdụng là hàm dự đoán tuyến tính nhưtrên và được biểu diễn bằng vector: >> predictor = [0, p(1), p(2), p(3),..., p(m-1), p(m)] Sử dụng hàm dpcmencothực hiện quá trình mã hóa với quantlà vector chứa các giá trịlượng tửcòn indexlà vector chứa các chỉsốtương ứng trong bộmã. Code Matlab: function [index,sig_quants] = DPCM(sig_comp,codebook,partition) % Luong tu hoa DPCM voi tin hieu sig_comp sau khi nen % bits la so bit bieu dien 1 mau %Su dung ham du doan la y(k) = x(k-1) predictor = [0 1];% Ham du doan delta bac 1 [index,sig_quants] = dpcmenco(sig_comp,codebook,partition,predictor); end 7 Khốối 3:Integer to Bit Converter Chuyển đổi các giá trị index từ 0- 255 thành các số nhị phân 8 bit. Code Matlab: function sig_enc = Encoder(index) %Bien doi tu ma thap phan sang nhi phan k bit Sig_enc= de2bi(index,'left-msb');%Bien doi chuoi thap phan %thanh chuoi bit nhi phan end Khốối 4:Mã chập Mã chập là một phương pháp mã hoá sửa sai quan trọng. Khác với mã khối, mã chập là loại mã có nhớ. Mặc dù, bộ mã hoá chập cũng nhận các thông điệp có số lượng ký hiệu xác định và tạo ra một từ mã cũng có số ký hiệu xác định, nhưng từ mã tạo ra ở mỗi thời điểm không chỉ phụ thuộc vào các ký hiệu của thông điệp hiện tại mà còn phụthuộc vào các ký hiệu của các thông điệp đã được mã hoá trước đó. Mã chập là mã tuyến tính có ma trận sinh có cấu trúc sao cho phép mã hóa có thể xem như 1 phép lọc. Mã chập được sử dụng rộng rãi trong thực tế bởi mã hóa được xem như một tập hợp các bộ lọc số tuyến tính với các mã là các đầu ra của bộ lọc được ghép xen kẽ. Bộ mã hóa cho mã chập thường được coi là một tập hợp các bộ lọc số. Ví dụ: Dòng mk đi qua 2 bộ lọc dùng chung các phần tử nhớ tạo ra 2 dòng ra. C(1)k = mk + mk-1 + mk-2 và C(2)k = mk + mk-2. Vì cứ mỗi bit vào lại có hai bit được mã hóa đưa ra, kết quả là ta được một mã có tốc độ R=1/2. 8 Mã chập được tạo ra bằng cách cho chuỗi thông tin tru yền qua hệ thống c á c thanh ghi dịch tuyến tính có số trạng thái hữu hạn. Cho số lượng thanh ghi dịch làm(cũng ký hiệu là N), bộ mã cók bit ngõ vào và đầu ra bộ mã chập cónbit ngõ ra(nhàm đại số tuyến tính hoặcnngõ ra cộ ng modulo). Tốc độ mã làR = k/n, s ố ô nhớ của bộ ghidịch làm×k và tham số Lgọi là chiều dài ràng buộc (Constraint length) của mã chập (với L=k(m-1)) Code Matlab cho việc mã hóa mã chập: function sig_conv = EnConv(sig_bit) %Ham ma chap voi toc do R=1/2 %Cac da thuc sinh la G2=5, G3=7 %Chieu dai rang buoc L=3 %inpbits la tin hieu vào L=3; G =[5 7]; trellis = poly2trellis (L,G); for i = 1 : 1024; sig_conv(i,:) = convenc([sig_bit(i,:)],trellis); end end Khốối 5: Điềều chềố QPSK Điều chế tín hiệu là quá trình biến đổi một hay nhiều thông số của một tín hiệu tuần hoàn theo sự thay đổi một tín hiệu mang thông tin cần truyền đi xa. Tín hiệu tuần hoàn gọi là sóng mang. Tín hiệu mang thông tin gọi là tín hiệu được điều chế. Ở đầu thu bộ giải điều chế sẽ dựa vào sự thay đổi thông số đó của sóng mang để tái tạo lại tín hiệu mang thông tin ban đầu. Các thông số của sóng mang được dùng trong quá trình điều chế có thể là biên độ, pha, tần số. Trong điều chế số, một sóng mang tương tự sẽ được biến đổi theo một chuỗi bit có chiều dài cố định hoặc thay đổi. Đây cũng có thể được coi là một dạng biến đổi tương tự-số. Hình dạng của sóng mang được lấy từ một tập hợp hữu hạn các ký hiệu. QPSK viết tắt của từ Quadrature Phase Shift Keying, gọi là điều chế pha cầu phương (điều chế pha vuông góc). QPSK là 1 kỹ thuật điều chế tín hiệu số, mã hóa 2 bit thành 1 symbol. Sơ đồ nguyên lý bộ điều chế QPSK sử dụng một trong 4 pha lệch nhau 900. 9 Tín hiệu băng gốc được đưa vào bộ biến đổi nối nối tiếp thành song song. Đầu ra được 2 luồng �1 số liệu có tốc độ bit giảm đi 1 nửa, đồng thời biến đổi tín hiệu đơn cực thành tín hiệu . Hai 0 sóng mang đưa tới 2 bộ trộn làm lệch pha nhau 90 . Tổng hợp tín hiệu đầu ra 2 bộ trộn ta được tín hiệu QPSK. Trong Matlab sử dụng hàm pskmod với số mức điều chế là 4 để thực hiện điều chế QPSK. Trước khi điều chế thì phải đưa 2 bit thành các ký tự từ 0 đến 3. Code Matlab cho hàm QPSK function sig_mod = QPSK(sig_conv) %Dieu che QPSK cho tin hieu da dc ma chap %Chuyen doi 2 bit thanh cac ky hieu k = 2;%2bit/1ky tu x = bi2de(reshape(sig_conv,k,length(sig_conv)/k).','left-msb'); sig_mod = pskmod(x,4); end Khốối 6:Kềnh truyềền cộng nhiềễu AWGN (ADDITIVE WHITE GAUSSIAN NOISE) Với một kênh thông tin cơbản, tín hiệu tin tức sau khi điều chếsẽ được gửi đi trên kênh truyền. Trong thực tếtín hiệu khi truyền trên kênh truyền sẽchịu tác động bởi các yếu tốcủa kênh truyền làm cho tín hiệu thu được không còn giống hoàn toàn tín hiệu phát. Tuỳtheo các dạng môi trường truyền khác nhau và các hệthống thông tin khác nhau, sựtác động nói trên sẽcó những đặc trưng khác nhau. MATLAB cho phép người sửdụng mô phỏng ba loại kênh truyền cơbản, đó là: kênh truyền với nhiễu AWGN, kênh truyền fading và kênh truyền đối xứng nhịphân. Kênh truyền AWGN là dạng kênh truyền có nhiễu cộng, trắng và phân bốtheo hàm Gauss. Nhưvậy, một tín hiệu khi truyền qua kênh truyền này sẽphải thêm vào một tín hiệu ngẫu 10 nhiên không mong muốn phân bốtheo hàm Gauss:  1 p( x)  e  2 ( x   )2 2 2 Kênh truyền AWGN trong MATLAB được mô phỏng bằng hàm awgn. Hàm này sẽcộng nhiễu Gauss vào một tín hiệu cho trước (có thểlà tín hiệu thực hay phức), mức công suất nhiễu do người sửdụng quy định thông qua hai thông sốnhập: - Mức công suất tín hiệu phát (đơn vịmặc định là dBW, hoặc có thểdùng đơn vịW) - TỷsốSNR (đơn vịmặc định là dB) Cú pháp của hàm awgnnhư sau: >>awgn(X,SNR,SigPower,State,PowerType) Trong đó: X là tín hiệu phát SNR là tỷsốcông suất tín hiệu trên nhiễu (tính bằng dB) SigPower cho biết công suất tín hiệu vào (dBW), hoặc nếu SigPower = ‘measured’thì MATLAB sẽ đo công suất tín hiệu phát trước khi cộng nhiễu State cho biết trạng thái của bộ phát tín hiệu ngẫu nhiên PowerType chỉ ra đơn vịcủa SNRvà SigPowerlà đơn vịdecibel (‘dB’) hay đơn vị tuyến tính(‘linear’) Ba thông số cuối không nhất thiết phải đưa vào, trong trường hợp không có các thông số này thì xem như công suất tín hiệu phát bằng 0 dBW và đơn vị của SNR là dB. Code Matlab cho kênh AWGN: function sig_noise = awgnchan(sig_mod) %Cho tin hieu sau khi da dieu che vao kenh truyen cong nhieu AWGN %Kenh truyen AWGN la kenh truyen nhieu trang va phan bo Gauss %Gia su kenh truyen co nang luong bit tren mat do cong suat nhieu Eb/N0 = %9dB M = 4; %Dieu che QPSK k = log2 (M); nsamp = 1; EbNo = 9;%Don vi dB SNR = EbNo + 10*log10 (k) - 10*log10 (nsamp); sig_noise = awgn(sig_mod,SNR,'measured'); end 11 Khốối 7: Giải điềều chềố QPSK Sơ đồ nguyên lý: Hai sóng mang chuẩn vào bộ trộn sau khi đã qua được đồng bộ với tín hiệu vào và qua các bộ lọc �1 thông thấp sẽ thu được tín hiệu .Qua mạch logic sẽ được các tín hiệu đơn cực. Trong Matlab, để giải điều chế QPSK dùng hàm Z = pskdemod(Y,M,PHASE) với M = 4 là số mức điều chế, PHASE là pha ban đầu. Code Matlab cho hàm giải điều chế: function sig_demod = DeQPSK(sig_noise) %Giai ma QPSK tin hieu sau khi cong nhieu %Su dung ham pskdemod sig_demod = pskdemod(sig_noise,4); end Khốối 8:Giải mã mã chập Thuật toán Viterbi là một giải pháp được sử dụng phổ biến để giải mã chuỗi bit được mã hóa bởi bộ mã hóa mã chập. Thuật toán Viterbi có thể dùng để giải mã những chuỗi bit mà được mã hóa bởi bất cứ bộ mã chập nào. Tín hiệu sau khi mã hóa được đi qua kênh truyền sau đó đến bộ thu, tại đây tin hiệu được lượng tử hóa trước khi sử dụng thuật toán viterbit để giải mã. 12 Sử dụng quyết định cứng với hàm videc để giải mã len = 2;%Chieu dai traceback để giải mã decbits = vitdec(encbits,trellis,len,’trunc’,’hard’,3); Code Matlab cho hàm giải mã: functionsig_deconv = DeConv(sig_demod) %DeConv khoi giai ma ma chap voi toc do R = 1/2 %Su dung hàm vitdec voi quyet dinh cung %Dau vao la tin hieu sau khi giai dieu che QPSK z = de2bi(sig_demod,'left-msb'); %Chuyen doi ky tu thanh cac bit nhi phan z = reshape(z.',prod(size(z)),1); %Chuyen doi ma tran thanh 1 vecto L = 3; G = [5 7]; trellis = poly2trellis(L,G); len = 2; sig_deconv = vitdec(z,trellis,len,'trunc','hard'); end Khốối 9: Giải mã Bit to Integer Converter Khối này chuyển đổi từng 8 bit nhị phân thành các chỉ số index có giá trị từ 0 – 255. Code Matlab cho hàm này: functionindex = Decoder(sig_deconv) %Bien doi 1 chuoi nhi phan thanh so thuc %8 bit la 1 ky tu z = reshape(sig_deconv,8,length(sig_deconv)/8); z = z’; index = bi2de(z,'left-msb'); end Khốối 10 : Giải mã lượng tử hóa DPCM Để thực hiện giải mã hoá DPCM, xác định sự phân hoạch với giá trị chỉ số index đầu vào và hàm dự đoán, để dự đoán giá trị của tín hiệu ở thời điểm hiện tại. Chúng ta sẽ sử dụng lại hàm dự đoán đã dùng ở phần mã hóa là: y = x(k-1). Trường hợp đặc biệt này m = 1 được gọi là điều chế delta. 13 predictor = [0 1]; % Hàm dự đoán y(k)=x(k-1) [sig, quant] = dpcmdeco(index, codebook, predictor); siglà tín hiệu tin tức được khôi phục còn quantlà tín hiệu sai sốdự đoán. Code Matlab cho hàm: function [sig,quants] = DeDPCM(index,codebook) %Ham giai ma luong tu hoa DPCM %Hàm du đoán y(k)=x(k-1) predictor = [0 1]; [sig,quants] = dpcmdeco(index, codebook, predictor); end Khốối 11: Giãn tín hiệu Tín hiệu trước khi lượng tử hóa đã được nén theo luật A, nên sau khi giải mã lượng tử hóa ta sẽ giãn tín hiệu để được tín hiệu thu được. A = 87.6; %Thông số cho bộ giãn tín hiệu theo luật A sig_r = compand(sig_quant,Mu,max(sig_quant),'mu/expander'); sig_quant là tín hiệu sau khi giải mã lượng tử hóa DPCM Code Matlab: function [sig_r] = expander(sig_quant) %Ham giai nen theo luat A A = 87.6; %Thong so A cua bo giai nen sig_r = compand(sig_quant,A,max(sig_quant),'A/expander'); end Khảo sát tỷ lệ lốễi bit trong đường truyềền Sử dụng hàm bitter trong Matlab sẽ so sánh hai tập dữ liệu nhị phân cho trước và trả về số bit lỗi và tỷ lệ lỗi bit. [number_of_errors,bit_error_rate] = biterr(sig_enc,sig_deconv); Phương sai: dictor_r = sum((signal_r – signal).^2)/length(signal_r); 14 Với signal_r là tín hiệu thu được bên thu. Code Matlab cho toàn chương trình: >> %Đọc vào 1 tín hiệu âm thanh wav đã được lấy mẫu 16 bit với tần số lấy mẫu 8000Hz >> [filename,pathname]=uigetfile('*.wav'); >> [signal Srate nBits] = wavread([pathname,filename]); >> %File được đọc vào là BTL.wav >> %Khảo sát tín hiệu signal >>l = length(signal); >>k = mod(l,1024);%Đảm bảo độ dài của signal là bội của 1024 >>signal = signal([1:l-k],1);% Loại bỏ k phần tử dư >> Mp = max(signal); >> bits = 8;%Dùng 8 bit để mã hóa 1 mẫu >> levels = 2^bits;%So mau 8 bit mã hóa được >> step_size = (2*Mp)/levels;%Bước nhảy cho mỗi khoảng >> codebook = [-Mp+step_size:step_size:Mp]; % Số đại diện cho mỗi khoảng trong phần >> %partition >> partition = [-Mp+2*step_size:step_size:Mp] %Chia tín hiệu thành 256 khoảng >> %Chia tín hiệu thành các frame, mỗi frame có chứa 1024 mẫu >> frame = reshape(signal,1024,length(signal)/1024); >> %frame là một ma trận có 1024 hàng và length(signal)/1024 cột >> k = length(signal)/1024; >> %Thuc hiên LTH,Nén ,mã hóa, điều chế , truyền, giải điều chế >> %từng frame một với frame(:,j) lấy tất cả các phần tử của cột thứ j >> %Vòng lặp >> for i = 1:k 15 sig_t = frame(:,i);%Chọn frame thứ i sig_comp = compressor(sig_t);%Thuc hien nen [index,sig_quant] = DPCM(sig_comp,codebook,partition); sig_enc = Encoder(index);%Chuyen các chỉ số index sang chuỗi số nhị phân sig_conv = EnConv(sig_enc);%Ma chap sig_mod = QPSK(sig_conv);%Điều chế QPSK với pha 0 sig_noise = awgnchan(sig_mod);%Đưa tín hiệu đã điều chế lên kênh truyền AWGN sig_demod = DeQPSK(sig_noise);%Giai điều chế QPSK sig_deconv = DeConv(sig_demod);%Giải mã mã chập index_out = Decoder(sig_deconv);%Chỉ số đầu ra sig_dequant = DeDPCM(index_out,codebook);% giải mã lượng tử hóa sig_r = expander(sig_dequant);% Giải nén %sig_r là tín hiệu đầu ra ứng vào frame thứ i đầu vào %Tính tỉ lệ lỗi bit trên mỗi frame[number_of_errors,bit_error_rate] = biterr(sig_conv,decodmsg) [number_of_errors,bit_error_rate] = biterr(sig_enc,sig_deconv); N_er(i) = number_of_errors; B_er(i) = bit_error_rate; %Phương sai trong mỗi frame sig_r = sig_r’; dictor(1,i) = sum((sig_r – sig_t).^2)/length(sig_r); signal_re (:,i) = sig_r;%tín hiệu thu được đưa vào một cột của ma trận signal_r end >>%Kết thúc vòng lặp. Tín hiệu nhân được ở bên thu nằm trong ma trận signal_r >>signal_r = reshape(signal_re,prod(size(signal_re)),1);%Chuyển ma trận về ma trận 1 cột 16 >>%Vẽ N_er và B_er >>subplot(2,1,2);plot(B_er);title(‘Ty le loi bit tren moi frame’);xlabel(‘frame’);ylabel(‘Ty le bit loi’); >>sound(signal_r);%Phát tín hiệu thu được Kết quả: Khi tín hiệu âm thanh đưa vào là file road.wav Nhận xét: III. KẾẾT LUẬN  Độ dài của tín hiệu đầu vào càng lớn thì thời gian xử lý càng lâu.  Tỷ lệ lỗi bit tuân theo phân bố Gauss, với tỷ số Eb/No càng nhỏ thì tỷ lệ lỗi bit càng lớn.  Với Eb/No < 10dB thì nên sử dụng phương pháp điều chế BPSK, còn 10 < Eb/No < 17 thì sử dụng điều chế QPSK.  Tín hiệu thu được gần giống với tín hiệu phát đi nhưng có nhiễu là không đáng kể khi tỷ số Eb/No lớn. IV. TÀI LIỆU THAM KHẢO: 1. Nguyễn Quốc Trung:Xử lý tín hiệu và lọc số. 2. Quách Tuấn Ngọc:Xử lý tín hiệu số. 17
- Xem thêm -