Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 84 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
84
Dung lượng
2,36 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI ĐỖ TRỌNG TUẤN MỘT PHƯƠNG PHÁP ĐẢM BẢO CHẤT LƯỢNG CHO DỊCH VỤ TRUYỀN THÔNG ĐA HƯỚNG THỜI GIAN THỰC QUA MẠNG IP Chuyên ngành: Thông tin vơ tuyến, phát vơ tuyến truyền hình Mã số: 2.07.02 LUẬN ÁN TIẾN SĨ KỸ THUẬT CÁN BỘ HƯỚNG DẪN KHOA HỌC PGS.TS PHẠM MINH HÀ Hà Nội - 2006 CHƯƠNG 2: PHỎNG TẠO THAM SỐ CHẤT LƯỢNG CỦA TÍN HIỆU PHÁT THANH KHI TRUYỀN TẢI QUA MẠNG IP 2.1 Các tham số chất lượng mạng 2.1.1 Giới thiệu Chất lượng tín hiệu phát truyền tải qua mạng IP bị ảnh hưởng suy giảm tác động yếu tố mạng Các yếu tố mạng bao gồm tỷ lệ tổn thất gói tin, trễ mạng biến động trễ mạng tham số tác động đến chất lượng dịch vụ tín hiệu đầu thu PQoS (Perceived Quality of Service) Mối quan hệ yếu tố thể hình 2.1 Chất lượng dịch vụ đầu thu Hình 1: Mối quan hệ yếu tố ảnh hưởng đến QoS [36] Từ quan điểm dịch vụ đầu cuối - đến - đầu cuối, tỷ lệ tổn thất gói tin tổng quát bao hàm tỷ lệ tổn thất mạng tỷ lệ tổn thất hủy gói đệm tái tạo Độ trễ tổng quát bao gồm trễ mạng trễ đệm, gây nên thời gian lưu gói tin đệm tái tạo Ngồi tỷ lệ tổn thất gói tin độ trễ tổng qt, chất lượng tín hiệu thu nhận PQoS cịn phụ thuộc vào chuẩn CODEC, giải thuật bù tổn thất gói tin đặc biệt phương thức điều khiển lịch trình tái tạo gói tin đệm tạo đầu thu 2.1.2 Tổn thất gói tin Tổn thất gói tin nguyên nhân gây ảnh hưởng đến chất lượng tín hiệu phát truyền tải qua mạng IP Tổn thất gói tin xảy hủy gói tin mạng IP ( tổn thất mạng ) loại bỏ gói tin giao tiếp mạng đệm tái tạo đầu cuối thu nhận thể hình 2.1 Tổn thất mạng thường xảy tắc nghẽn dẫn tới tràn đệm định tuyến, định tuyến không ổn định độ không tin cậy đường truyền trường hợp kênh vơ tuyến, tắc nghẽn ngun nhân chủ yếu gây nên tổn thất 2.1.2.1 Mơ hình tổn thất Bernoulli Trong mơ hình tổn thất Bernoulli [39][45], tổn thất gói tin độc lập với (đặc tính khơng nhớ) cho dù gói tin kề trước bị tổn thất khơng tổn thất Hình 2: Mơ hình tổn thất Bernoulli N Trạng thái tổn thất gói tin xem xét biến ngẫu nhiên {Li }i =1 có tính chất phân bố xác định độc lập IID (Independent and Identical Distributed) Giá trị biến ngẫu nhiên Li = tương ứng với tình trạng gói tin thứ i bị tổn thất với xác xuất Pi độc lập với gói tin thứ j với ∀j ≠ i Giá trị xác xuất Pi = P với tất gói tin Do đó, mơ hình Bernoulli tồn trạng thái % thể hình 2.2 Giá trị xác xuất P ước đốn thơng qua việc đo đạc tham số gói tin từ nhận đầu thu: N % P= ∑L i N = Ltot N ( ) % Theo (2.1) giá trị ước đoán xác xuất P tương ứng với tổng số gói tin bị tổn thất chia cho tổng số gói tin truyền tải Trong mơ hình tạo tham số mạng, mơ hình Bernoulli sử dụng nhằm xác định trạng thái tổn thất gói tin Khi có yêu cầu xác định trạng thái gói tin, biến ngẫu nhiên r phát sinh theo phân bố khoảng giá trị [0,1] với xác xuất p Nếu r < p gói tin bị hủy tương ứng với trạng thái bị tổn thất ngược lại 2.1.2.2 Mơ hình Gilbert trạng thái Hầu hết nghiên cứu gần truyền tải tiếng nói qua mạng IP sử dụng mơ hình Gilbert để thể đặc tính tổn thất gói tin [39][45][46] Trong mơ hình Gilbert trạng thái, tồn hai trạng thái (trạng thái trạng thái 1) thể hình 2.2 Biến ngẫu nhiên X xác định sau: X = ( trạng thái ) thể nhận gói tin hay gói tin không bị tổn thất ngược lại X = ( trạng thái ) thể gói tin bị tổn thất, với p xác xuất gói tin bị tổn thất nhận gói tin kề trước q xác xuất gói tin nhận bị tổn thất gói tin kề trước bị tổn thất Hình 3: Mơ hình Gilbert trạng thái Giả thiết P0 xác xuất xảy trạng thái gói tin P1 xác xuất xảy trạng thái gói tin Khi đó: P0 = P(X = 0) P1 = P(X = 1) Tại trạng thái ổn định, P0 P1 xác định sau: P0 = (1 − p ).P0 + (1 − q ).P P0 + P = 1 ( 2 ) ( ) P1 hay xác xuất tổn thất không điều kiện ulp (unconditional loss probability) xác định sau: P= p p +1− q ( ) Xác xuất tổn thất không điều kiện cung cấp khả đo đạc tỷ lệ tổn thất gói tin trung bình Trong đó, q tham chiếu xác xuất tổn thất có điều kiện clp (conditional loss probability) Mơ hình Gilbert thể phân bố xác xuất k gói tin liên tiếp bị tổn thất tương ứng với xác xuất pk xảy lỗi cụm có độ dài k xác định theo (2.5) Pk = P (Y = k ) = (1 − q ).q k −1 ( ) Y xác định biến ngẫu nhiên mơ tả phân bố độ dài cụm gói tin tổn thất tương ứng với kiện xảy tổn thất cụm gói tin liên tiếp Dựa vào biểu thức (2.5), độ dài cụm gói tin tổn thất trung bình E[Y] tính tốn sau: ∞ ∞ k =1 k =1 E[Y ] = ∑ k pk = ∑ k (1 − q ).q k −1 = 1− q ( ) E[Y] xác định dựa vào q ứng với xác xuất tổn thất có điều kiện cho thấy giá trị độ dài tổn thất cụm trung bình phụ thuộc vào đặc tính tổn thất hai gói tin liên tiếp Xác xuất p q xác định từ thống kê phân bố độ dài tổn thất liệu theo dõi lưu lượng Giả thiết, Oi với i = 1,2, ,n-1 cụm tổn thất thể số cụm tổn thất có độ dài i, n-1 độ dài lớn cụm gói tin tổn thất Trong trường hợp tổng số gói tin truyền tải O∑ , xác định p, q sau: n −1 p= ∑O i i =1 O∑ n −1 q= ∑ O (i − 1) i =1 i n −1 ∑ O i i =1 i ( ) Khi p = q, mơ hình Gilbert trạng thái mơ hình Bernoulli 2.1.3 Trễ biến động trễ Trễ biến động trễ (jitter) hai số yếu tố mạng ảnh hưởng đến chất lượng truyền tải dịch vụ thời gian thực nói chung truyền tải tín hiệu phát thời gian thực qua mạng IP nói riêng Trễ từ đầu cuối đến đầu cuối xác định khoảng thời gian bên phát bên thu bao gồm thành phần chủ yếu sau đây: • Trễ đường truyền: Là khoảng thời gian đề truyền tải bit từ phía phát đến phía thu Trễ đường truyền phụ thuộc vào khoảng cách vật lý tuyến liên lạc phương tiện truyền dẫn Khi truyền tải qua cáp quang, cáp đồng trục cáp xoắn đơi, trễ chiều khoảng µs/km • Trễ truyền tải: Là tổng khoảng thời gian gửi gói tin khỏi giao diện mạng từ hàng đợi Với đường truyền Internet mạng diện rộng điển hình với tốc độ 622 Mb/s (STM-4), thơng thường trễ truyền tải chặng khoảng 20 às với gói tin có độ dài tối đa MTU 1500 Bytes • Trễ hàng đợi: khoảng thời gian gói tin lưu giữ hàng đợi kể từ gói tin đưa đến cổng vào xử lý Trễ hàng đợi nguyên nhân gây nên biến động trễ từ đầu cuối đến đầu cuối phụ thuộc vào tải lưu lượng mạng hay tình trạng tắc nghẽn mạng • Trễ xử lý mã hóa/giải mã: khoảng thời gian cần thiết để mã hóa phía phát giải mã tín hiệu phía thu Giá trị trễ phụ thuộc vào phương thức mã hóa sử dụng • Trễ đóng gói / mở gói tin: khoảng thời gian cần thiết để bổ sung tiêu đề hình thành gói tin phía phát khoảng thời gian tách tiêu đề tải trọng phía thu • Trễ tái tạo: khoảng thời gian gói tin lưu giữ đệm tái tạo kể từ thu nhận đến tín hiệu tái tạo đầu cuối Theo khuyến nghị tổ chức ITU, với thông tin tiếng nói truyền qua mạng IP, trễ chiều hầu hết ứng dụng không vượt 150ms giá trị giới hạn 400 ms để thu tín hiệu chấp nhận Biến động trễ giá trị thống kê thay đổi mặt thời gian thời điểm đến gói tin liên tiếp, nguyên nhân chủ yếu biến đổi trễ hàng đợi Theo khuyến nghị RFC 3550, IETF xác định biến động trễ biến đổi trung bình khoảng sai lệch thời điểm phát thu hai gói liên tiếp với giá trị tuyệt đối cân chỉnh thông qua hệ số biến đổi = 1/16 [21] Biến động trễ tính tốn liên tục cho gói tin thứ i nhận Với gói tin xác định, biến động trễ Ji cho gói tin thứ i tính tốn sau: Ji = Ji−1 + (|D(i − 1, i)| − Ji−1 ) / 16 ( ) Với D khoảng thời gian sai khác thời điểm đến hai gói tin liên tiếp 2.1.3.1 Trễ hành trình gói tin chiều Hình 4: Mơ hình truyền tải gói tin chiều Trong đó: - di khoảng cách vật lý định tuyến ( i -1 ) ( i ) - c tốc độ truyền tín hiệu - bi băng thông tuyến kết nối i - s kích thước gói tin - fi trễ chuyển tiếp định tuyến Hình 2.4 thể mơ hình truyền tải gói tin chiều định tuyến ( i-1 ), ( i ) ( i+1 ) với băng thông kết nối khác Giả thiết, gói tin sẵn sàng gửi đi, gói tin tức thời gửi vào đường truyền mạng Khoảng thời gian để bit gửi từ định tuyến (i-1) đến định tuyến thứ (i) xác định thời gian truyền dẫn tín hiệu phụ thuộc hồn tồn vào phương tiện truyền dẫn xác định sau: ∆t prog = di c ( ) Thông thường, với kết nối mạng LAN trễ truyền dẫn biến thiên khoảng vài [às], kết nối vệ tinh trễ truyền dẫn lên tới hàng trăm [ms] Trễ truyền tải gói tin khoảng thời gian để tất bit gói tin truyền tải từ định tuyến ( i-1 ) đến định tuyến (i) Trễ truyền tải phụ thuộc vào kích thước gói tin băng thông tuyến kết nối, thể quan hệ sau: ∆ttrans = Trong đó: s bi ( 10 ) - s kích thước gói tin - bi băng thông tuyến kết nối i Các gói tin thu nhận đinh tuyến (i) đưa vào hàng đợi xếp hàng thời điểm tạo lịch trình đưa gói tin lên tuyến truyền dẫn kế tiếp, khoảng thời gian xác định gọi trễ chuyển tiếp fi Ba yếu tố trễ hình thành trễ tổng thể chặng truyền dẫn hai định tuyến ( i-1 ) ( i ) Trễ hành trình chiều gói tin cho n chặng phụ thuộc vào kích thước gói tin thể theo biểu thức sau: ⎡ di s ⎤ n ⎡ di s ⎤ n ∆tOTT (n, s) = ∑ ⎢ + + fi ⎥ = ∑ ⎢ + ⎥ + ∑ fi bi i =1 ⎣ c ⎦ i =1 ⎣ c bi ⎦ i =1 n ( 11 ) Với môi trường mạng độ dài gói tin xác định, tính bất định ∆tOTT phụ thuộc vào trễ chuyển tiếp định tuyến thời gian truyền dẫn băng thơng xem khơng đổi kết nối xác định Trễ chuyển tiếp phụ thuộc vào dung lượng hàng đợi có tương quan chặt chẽ với tải mạng, ∆tOTT biến đổi thuận theo tải mạng 2.1.3.2 Trễ hành trình gói tin hai chiều Hình 5: Mơ hình truyền tải gói tin hai chiều Trong đó: - di : khoảng cách vật lý định tuyến ( i -1 ) ( i ) - c : tốc độ truyền tín hiệu - bi : băng thơng tuyến kết nối i - s, sres : kích thước gói tin theo hướng thuận hướng ngược - fi : trễ chuyển hướng thuận - f'i-1: trễ chuyển hướng ngược Mơ hình truyền tải gói tin hai chiều thể hình 2.5 với trường hợp gói tin chuyển tiếp ( kích thước gói tin không đổi sres = s ) phản hồi ( kích thước gói tin phản hồi thay đổi so với hướng thuận sres # s ) từ hướng thuận sang hướng ngược nút cuối Trễ hành trình gói tin hai chiều nút ( i-1 ) nút ( i ) : ∆ti ( s) = di s d s + + fi + i + res + f 'i −1 c bi c bi ( 12 ) Như vậy, trễ hành trình hai chiều gói tin xác định sau: n ⎡ s + sres ⎤ d ∆ RTT (n, s, sres ) = ∑ ⎢ + i + fi + f 'i −1 ⎥ bi c i =1 ⎣ ⎦ n ⎡ s + sres d ⎤ n = ∑⎢ + i ⎥ + ∑ ( fi + f 'i −1 ) bi c ⎦ i =1 i =1 ⎣ ( 13 ) Độ xác giá trị trễ hành trình hai chiều ∆ RTT phụ thuộc vào tính đối xứng tuyến truyền dẫn Trong trường hợp đường truyền không đối xứng, ∆ RTT xác định tổng cộng trễ hành trình chiều theo hướng thuận hướng ngược Để thuận lợi tránh sai số đồng đồng hồ bên thu bên phát, phương pháp xác định trễ hành trình hai chiều thường sử dụng, nhiên trường hợp không xác định tắc nghẽn xảy theo hướng thuận hay hướng ngược đường truyền tải gói tin 2.2 Đề xuất mơ hình tạo tham số QoS qua mạng IP 2.2.1 Kiến trúc mô hình Các tham số mạng QoS mạng IP tạo thơng qua xử lý gói tin mức vật lý [62][63] Tuy nhiên phương thức phụ thuộc vào hệ điều hành, thực theo phương thức truyền thông đơn hướng chưa hỗ trợ tái tạo ảnh hưởng mạng từ liệu thực tế đo đạc từ trước Để khắc phục hạn chế trên, thông số QoS mạng Internet thực tế biến thiên cách ngẫu nhiên luận án mơ hình hóa thực tạo qua hai phương thức trực tuyến - Online không trực tuyến - Offline hỗ trợ hai phương thức truyền thông đơn hướng đa hướng Với phương thức khơng trực tuyến (hình 2.6b), thơng số đọc từ tệp số liệu thống kê qua thực nghiệm từ trước Với phương thức trực tuyến, khối tạo mạng cung cấp trực tuyến thông tin độ trễ mạng tình trạng tổn thất gói tin từ tạo thơng số thể hình 2.6a - ix - Phụ lục 5: Mã nguồn thực thuận tốn phát khoảng tín hiệu tích cực / khoảng lặng bên phát Thuật toán thực xác định gói tin cần truyền mang tín hiệu tích cực hay khoảng lặng tín hiệu phát dự việc tính tốn lượng so sánh ngưỡng Q trình phát mức tín hiệu tích cực thực cách gọi hàm: double SoundDevice:: silenceDetect ( char *inputData, int inputSize ) Trong : inputData: khối liệu vào mang tín hiệu phát nguồn, inputSize : kích thước khối liệu liệu đầu vào mã hóa Trước hết, chương trình xác định số mẫu tính hiệu gói tin từ khối liệu đầu vào input Data Tính tốn lượng mẫu tín hiệu lưu vào biến totalEnergy Cuối cùng, mức lượng tín hiệu trung bình everageEnergy mẫu gói tin xác định Giá trị biến everageEnergy so sánh với ngưỡng lượng tín hiệu phát tích cực activeSignalTheshold Hàm trả kết khoảng lặng tín hiệu giá trị mức lượng trung bình mẫu tín hiệu gói tin khoảng tín hiệu tích cực Mã nguồn chương trình: #define energy (x) pow (x ,2 ) double SoundDevice::silenceDetect ( char *inputData, int inputSize ) { double averageEnergy = 0; int numberSample = size *8 / bitPerSample; for ( int i = ; i < numberSample ; i++ ) { if (bitPerSample ==8) { averageEnergy += energy (* ( data + i ) ); } else if ( bitPerSample ==16 ) { averageEnergy += energy ( * (short * ) ( data + i*2 ) ); } } printf ("%d :: %0.3f\n", seq, averageEnergy/numberSample); // seq: thứ tự gói tin -x- return (averageEnergy / numberSample ); } a Giao diện chương trình xử lý số liệu khoảng tích cực / khoảng lặng tín hiệu b Minh họa khoảng tích cực / khoảng lặng tín hiệu phát Phụ lục 6: Mã nguồn thực mã hóa tín hiệu phát Q trình mã hóa tín hiệu thực cách gọi hàm: int encodeData ( char * inputData, int inputSize, char * outputData ); Trong : inputData: khối liệu vào mang tín hiệu phát nguồn, inputSize : kích thước khối liệu liệu đầu vào mã hóa outputData : khối liệu mã hóa - xi - Hàm mã hóa tín hiệu encodeData trả dung lượng khối liệu mã hóa Khối liệu vào chia thành khung liệu có dung lượng 160 Bytes Mỗi khung liệu mã hóa dựa thuật tốn nén tín hiệu sử dụng thư viện Tùy thuộc vào mức chất lượng mà độ dài khung liệu mã hóa có kích thước khác Các khung liệu sau mã hóa ghép lại thành khối liệu mã hóa outputData dung lượng khối liệu trả Mã nguồn chương trình: # define FRAME_SIZE 160 int SpeexCodec::encodeData ( char* inputData , int inputSize, char *outputData ) { int outputSize = 0; int nbBytes = 0; int numberFrame = inputsize / ( FRAME_SIZE * sizeof ( short ) ); char *cbits = ( char * ) malloc ( 200 ); float *input = ( float * ) malloc ( FRAME_SIZE * sizeof ( float ) ); short * buffer16 = ( short * ) inputData; for ( int i = ; i < numberFrame ; i++ ) { // thực mã hóa tín hiệu speex_bits_reset ( &bits ); for ( int j = ; j < FRAME_SIZE ; j ++ ) *( input + j ) = * ( buffer16 + j + i * FRAME_SIZE ); speex_encode ( state, input, &bits); nbBytes = speex_bits_write ( &bits, cbits, 200 ); memcpy ( outputdata + i * nbBytes , cbits , nbBytes ); outputSize += nbBytes; } - xii - return outputSize; } Phụ lục 7: Mã nguồn thực giải mã tín hiệu phát Quá trình giải mã tín hiệu thực cách gọi hàm: int decodeData ( char * inputData, int inputSize , int nbBytes , char * outputData ); Trong : inputData: khối liệu vào mang tín hiệu phát mã hóa, inputSize : kích thước khối liệu liệu đầu vào giải mã nbBytes : số Byte tương ứng với mức chất lượng nén tham số cung cấp cho giải nén phục vụ giải mã liệu tương ứng với mức chất lượng mã hóa outputData : khối liệu giải mã Hàm mã hóa tín hiệu decodeData trả dung lượng khối liệu giải mã Khối liệu đầu vào chia nhỏ thành khung liệu mã hóa có kích thước nbBytes Các khung giải nén thành khung ban đầu liệu mang tín hiệu phát nguồn có kích thước FRAM_SIZE (160 bytes) dựa thuật tốn giải nén sử dụng thư viện Các khung liệu sau giải mã ghép lại thành khối liệu outputData phục vụ tái tạo tín hiệu phát dung lượng khối liệu trả Mã nguồn chương trình: int SpeexCodec::decodeData ( char* inputData,int inputSize, int nbBytes, char* outputData ) { int numberFrame = inputSize / nbBytes; int outputSize = 0; float *output = ( float * ) malloc ( FRAME_SIZE * sizeof ( float ) ); - xiii - short *data = ( short * ) malloc (FRAME_SIZE * sizeof ( short ) ); for ( int i = ; i < numberFrame ; i ++ ) { // thực giải mã tín hiệu speex_bits_read_from ( &bits , inputData + i * nbBytes , nbBytes ); speex_decode ( state, &bits, output ); for ( int j = ; j < FRAME_SIZE ; j ++ ) * ( data + j ) = * ( output + j ); memcpy ( outputData + i * FRAME_SIZE * sizeof ( short ) , ( char * ) data , FRAME_SIZE * sizeof ( short ) ); outputsize += FRAME_SIZE * sizeof ( short ) ; } return outputSize; } Phụ lục 8: Mã nguồn thực thuật toán thu liệu từ thiết bị âm lưu vào đệm phía phát Dữ liệu nguồn mang tín hiệu phát số hóa đọc từ đệm thiết bị âm lưu vào nhớ trung gian soundBuffer theo độ dài gói tin packetLength thiết lập trước Kế tiếp, thuật toán xác định mức lượng tín hiệu phát tích cực thực Kết trả định gói tin có lưu vào đệm phát trường hợp mang tín hiệu tích cực hay bị loại bỏ trường hợp mang tín hiệu khoảng lặng Dữ liệu trước lưu vào đệm phát mã hóa theo loại tải tin xác lập trước Các phần tử mang liệu lưu đệm phát gửi vào mạng theo điều khiển điều khiển lịch trình phát Mã nguồn chương trình: void SoundDevice::capture( ) - xiv - { // cấp phát đệm lưu liệu nguồn char* soundBuffer = ( char * ) malloc ( packetLength); int seqNumber = 0; int totalSilencePacket = ; int nbBytes = speexEncode->getEncodedByte ( qualityLevel ); int outputSize = len * nbBytes / FRAME_SIZE * sizeof ( short ) ; char * speexData = ( char * ) malloc ( outputSize ); stopTxProccess = FALSE; openSoundDevice( O_RDONLY); txBuffer->clear(); while ( ! stopTxProccess ) { if ( totalSilencePacket == SILENCE_PACKET_NUMBER) { for ( int i = SILENCE_PACKET_NUMBER - ; i > ; i ) { if ( txBuffer->count() >= i ) { txBuffer->remove ( txBuffer->count() - i ); totalSilencePacket = 1; } else { totalSilencePacket = txBuffer->count(); } } - xv - } // Đọc liệu từ đệm thiết bị âm lưu vào đệm trung gian int size = read ( sound_fd, soundBuffer, packetLength); sound_item_t * item = new sound_item_t; item->seqNumber = seqNumber; item->mark = silenceDetect (soundBuffer, size); if ( item->mark == 0) // tăng số biến đếm gói tin liên tiếp mang tín hiệu khơng tích cực totalSilencePacket ++ ; else // Gói tin bắt đầu chu kỳ tín hiệu phát tích cực, thiết lập lại biến đếm số gói tin mang tín hiệu khoảng lặng totalSilencePacket = ; switch ( codecType ) { case PCM: item->length = size; item->data = ( char * ) malloc ( item->length ); memcpy ( item->data, soundBuffer, size ); break; case SPEEX : item->length = speexEncode->encodeData ( soundBuffer, size, speexData); item->data = ( char * ) malloc ( item->length ); memcpy ( item->data , speexData, item->length); break; } - xvi - // Đưa gói liệu vào đệm phát txBuffer->append ( item ); seqNumber ++ ; } closeSoundDevice ( ); } Phụ lục 9: Mã nguồn module tạo lịch trình gửi liệu vào mạng void VoVBuffer::txTimerExpired() { if ( ( txBuffer->count( ) < initialWaterMark ) && !capturer->txFlag ) { txBufferProgressBar->setProgress( txBuffer->count( ) ); return; } else capturer->txFlag = TRUE; if ( txBuffer->isEmpty( ) && !capturer->txFlag ) { txTimer->stop(); stateInfor->info(); return; } if ( txBuffer->isEmpty( ) && capturer->txFlag ) { return; } else { rtp_header_t * rtpHeader = new rtp_header_t; rtpHeader ->seqNumber = txBuffer->at(0)->seqNumber; rtpHeader ->length = txBuffer->at(0)->length; rtpHeader ->timeStamp = QTime::currentTime ( Qt::UTC ); - xvii - int headerSize = sizeof (rtp_header_t ); int packetSize = headerSize + txBuffer->at(0)->length; if ( ( txBuffer->at(0)->mark != 0) { switch ( codecType ) { case PCM : rtpHeader->payloadType = PCM; break; case SPEEX: rtpHeader->payloadType = SPEEX; } } else rtpHeader->payloadType = SILENCE; char * rtpPacket = (char * ) malloc ( packetSize); memcpy (rtpPacket , rtpHeader , headerSize ); memcpy (rtpPacket+headerSize, txBuffer->at(0)->data, txBuffer->at(0)->length); sendDataToNetwork ( rtpPacket, packetSize); delete rtpHeader; free ( rtpPacket ); txBuffer->removeFirst(); } Phụ lục 10: Mã nguồn thực thuật toán thu nhận liệu từ mạng lưu vào đệm phía thu Module chương trình thực thao tác đọc liệu từ socket, tách liệu mang tín hiệu phát lưu vào đệm tạo, xử lý thông tin điều khiển, giải mã tín hiệu tính tốn thời điểm tái tạo tín hiệu phát gói tin Mã nguồn chương trình: # define alpha 0.998002 - xviii - void PlayoutBuffer::receiveData ( char * data, int size) { rtp_header_t * rtpHeader = new rtp_header_t; rtpHeader = (rtp_header_t * ) data; int inputSize; inputSize = rtpHeader ->length; char * inputData = ( char * ) malloc ( inputSize ); int nbBytes = speexDecode->getEncodedByte ( qualityLevel ); int outputSize = inputSize * FRAME_SIZE * sizeof ( short ) / nbBytes; char* outputData = ( char * ) malloc ( outputSize); QTime rxTime = QTime::currentTime ( Qt::UTC ); long rxTime = timeConversion ( rxTime ); long txTime = timeConversion (rtpHeader->txTime); int currentNetworkDelay = rxTime - txTime; memcpy ( inputData , data + sizeof ( rtpHeader ), inputSize); if ( rtpHeader->payloadType == SILENCE ) { startTalkSpurt = FALSE; return; } else { sound_item_t *item = new sound_item_t; item->seqNumber = rtpHeader->seqNumber; switch ( rtpHeader->payloadType ) { case PCM : - xix - item->length = inputSize; item->data = ( char * ) malloc ( item->length ); memcpy ( item->data , inputData , inputSize ); break; case SPEEX : item->length = speexDecode->decodeData ( inputData , inputSize, nbBytes , outputData); item->data = ( char * ) malloc ( item->length); memcpy ( item->data , outputData, item->length ); break; } if ( startTalkSpurt ) { // bắt đầu chu kỳ tín hiệu phát tích cực if ( !startFlag ) { // bắt đầu nhận liệu, khởi tạo đồng hồ tạo lịch trình tái tạo tín hiệu previousPlayoutTime = rxTime; playoutTime = ( int ) ( txTime + currentAvarageDelay + * currentDelayVariation ); item->interval = playoutTime - previousPlayoutTime; previousPlayoutTime = playoutTime; pushDataToPlayoutBuffer ( item ); if ( algorithmType == SPIKE_DET ) { beforePreviousNetworkDelay = currentNetworkDelay; previousNetworkDelay = currentNetworkDelay; - xx - delayMode = NORMAL; } playoutTimer->start ( item->interval, TRUE ); startFlag = TRUE ; } else { // Thiết lập thời điểm tái tạo tín hiệu gói chu kỳ tín hiệu phát tích cực playoutTime = ( int ) ( txTime + curentAverageDelay + * currentDelayVariation ); item->interval = playoutTime - previousPlayoutTime; previousPlayoutTime = playoutTime; // Đưa liệu vào đệm tái tạo pushDataToPlayoutBuffer ( item ); // Ước đoán trễ mạng networkDelayEstimation ( currentNetworkDelay ); } startTalkspurt = TRUE; } else { // Tái tạo tín hiệu từ gói tin chu kỳ tín hiệu tích cực playoutTime = previousPlayoutTime + packetTimeLength; // Thiết lập thời điểm tái tạo tín hiệu item->interval = playoutTime - previousPlayoutTime; previousPlayoutTime = playoutTime; // Đưa liệu vào đệm tái tạo pushDataToPlayoutBuffer ( item ); // Ước đoán trễ mạng - xxi - networkDelayEstimation ( currentNetworkDelay ); } } } Phụ lục 11: Mã nguồn thực thuật toán ước đoán trễ mạng biến động trễ trung bình gói tin phục vụ q trình tái tạo tín hiệu thích ứng Trễ mạng ước đốn xác định thông qua hàm: void PlayoutBuffer::networkDelayEstimation ( int currentNetworkDelay); Căn vào trễ mạng gói tin currentNetworkDelay [ms] Thuật tốn hàm trung bình mũ EXP_AVG thuật tốn SPIKE_DETECT sử dụng để tính tốn trễ mạng trung bình currentAverageDelay biến động trễ mạng trung bình currentDelayVariation Các thơng số sử dụng phục vụ việc tạo lịch trình tái tạo tín hiệu phát thích ứng theo tình trạng trễ mạng Mã nguồn chương trình: # define spike_factor 0.875 void PlayoutBuffer::networkDelayEstimation ( int currentNetworkDelay) { swicth ( algorithmType ) { case EXP_AVG: currentAverageDelay = alpha * previousAverageDelay + ( - alpha ) * currentNetworkDelay ; currentDelayVariation = alpha * previousDelayVariation + ( - alpha ) * abs ( currentAverageDelay - currentNetworkDelay ); break; case SPIKE_DET: if (delayMode == NORMAL ) { - xxii - if ( abs ( currentNetworkDelay - previousNetworkDelay ) > abs ( * currentDelayVariation ) + 800 ) { // đột biến trễ bắt đầu xuất var = 0; delayMode = SPIKE; } } else { // mode:: SPIKE var = var / + abs ( * currentNetworkDelay previousNetworkDelay - beforePreviousNetworkDelay ) / 8; if ( var