Bộ lượng tử hóa lại (Requantizer)

Một phần của tài liệu Kỹ thuật mã hóa thụ cảm (Trang 48)

II. NHÌN CHUNG VỀ HIỆU QUẢ CÁC

2. Bộ lượng tử hóa lại (Requantizer)

• Định nghĩa :

Công thức của lượng tử hóa lại mô tả việc xử lý để định tỉ lệ lại đối với dữ liệu đã được mã hóa Huffman. Độ lợi toàn cục và độ lợi của khối con ảnh hưởng tất cả các giá trị trong một cửa sổ thời gian. Ngoài ra, các hệ số tỉ lệ và cờ hiệu chỉnh độ lợi trong mỗi băng hệ số tỉ lệ .

Sau đây là phương trình lượng tử hóa lại của các cửa sổ ngắn. Giá trị được mã hóa Huffman tại chỉ số tại bộ đệm thứ i được gọi là isi , ngõ vào của khối sắp thứ tự lại thứ i được gọi là xri : Dùng cho khối ngắn :

A=global_gain [gr]-210 –(8)*subblock_gain[window][gr] B=scalefac_multiplier*scalefac_s[gr][ch][sfb][window]

Cho khối dài, công thức là:

A=global_gain [gr]-210

B=scalefac_multiplier*scalefac_l[gr] [ch][sfb]+

preflag[gr]*pretab[sfb]

preflag[sfb], được sử dụng cho việc khuyếch đại băng hệ số tỉ lệ ở tần số cao. Giá trị 210 là một hằng số cần để chia tỉ lệ các mẫu. Giá trị cao nhất của isi là 8206, không là 8191 như đã định bởi chuẩn [1]. Nguyên nhân là do bộ giải mã cấp thêm 15 vào giá trị của linbits. Linbits có thể dài 13 bit do đó có gía trị cao nhất là

213 – 1 = 8191 cho mỗi phần linbits . • Thực hiện :

Cả hai hàm mũ isi4/3 và 2A,B rất khó tính nếu dùng hàm thư viện toán học chuẩn pow(). Ngay cả khi dùng đơn vị xử lý dấu chấm động (FPU) hay DSP việc tính toán cũng không phải đơn giản .

Hàm isi4/3 trong bộ lượng tử hóa lại chấp nhận 8207 giá trị khác nhau. Bảng tìm kiếm sẽ nhanh, nhưng đòi hỏi khoảng 256 kbits bộ nhớ, chúng ta sẽ tìm một thuật toán được đề cập trong mục phương pháp Newton dưới đây.

Hàm 2 0.25 * A * 2 -B không chấp nhận hơn 384 giá trị khác nhau.

Điều đó có nghĩa là bảng tìm kiếm sẽ là sự lựa chọn tốt nhất, lưu ý rằng bảng có thể tạo ra thậm chí nhỏ hơn (196 giá trị ) bằng cách làm tròn giá trị nhỏ (< 2-35) khi hàm giảm xuống gần zero bởi vì không ảnh hưởng đến kết quả cuối cùng.

• Tiệm cận dựa trên bảng y=x4/3( Table-based Approach for y=x4/3): Bảng tìm kiếm cho hàm y=x4/3 có thể thực hiện dễ dàng. Bảng này có thể gộp vào như một phần của dữ liệu khởi tạo, hoặc nó có thể được tạo ra tại thời điểm thực thi nếu hàm pow() có sẵn .

Nếu có đủ bộ nhớ bảng tìm kiếm có thể bao gồm giá trị âm của isi . Điều này sẽ tăng tốc độ việc giải mã .

• Phương pháp Newton cho y=x4/3 (Newton’s Method for y=x4/3): Hàm y= x4/3 được viết lại thành y3-x4=0. Dạng này có thể thích hợp với phương pháp Newton tìm kiếm nó sẽ cho giá trị y xấp xỉ với x4/3.

Kết quả của hàm được tính thông qua việc lặp đi lặp lại quá trình giảm sai số | y-x4/3| :

Công thức được viết lại thành dạng thứ hai để tránh sự ước luợc dấu chấm động.

Giá trị bắt đầu là y0 của công thức lặp ảnh hưởng đến số lần lặp cần thiết để đạt được độ chính xác mong muốn. Với ứng dụng, độ chính xác lớn hơn 16 bits xem như có hiệu quả. Một giá trị khởi đầu tốt của y0 được tính toán thông qua hàm đa

thức y0 = a0 + a1 * x + a2 * x2 . Hàm này được thiết kế tương tự với y=x4/3 càng gần càng tốt với 0< x < 8207.

4. Phép biến đổi cosin rời rạc cải tiến đảo ngược (IMDCT)

• Định nghĩa :

IMDCT biến đổi các mẫu subband từ miền tần số sang miền thời gian. Biểu thức phân tích của IMDCT là :

Giá trị của n trong biểu thức có thể là 12 cho khối ngắn hoặc là 36 cho khối dài.

Đầu ra từ IMDCT phải được lấy cửa sổ với một hàm cố định được nạp chồng với dữ liệu từ khối trước.

• Thực hiện :

Thao tác IMDCT thì rất khó tính toán để tiến hành như được định nghĩa bởi chuẩn. Một bảng tìm kiếm có thể được dùng để thay thế cho hàm cos() , nhưng vòng lặp bên trong phương trình vẫn còn đòi hỏi việc xử lý. Thay vì chúng ta sẽ khảo sát giải thuật nhanh hơn cho IMDCT ở mục dưới.

Các hàm cửa sổ được thay thế bằng một bảng tìm kiếm 4 kbits.

• Tính toán trực tiếp ( Direct calculation) :

Tự tính toán trực tiếp IMDCT dễ thực hiện bởi vì nó chỉ bao gồm hai vòng lặp for đơn giản. Một bảng tìm kiếm có thể được dùng để thay thế cho hàm cos() gọi bên trong vòng lặp. • Thực hiện IMDCT nhanh ( Fast IMDCT implementation ):

Marovich đã nêu ra trong [2] rằng phương pháp của Konstantinides về việc tăng tốc độ tính toán của ma trận băng lọc đa pha cũng có thể dùng cho IMDCT 12 và 36 điểm :

Kết quả N điểm tương đồng với IMDCT N điểm như được định nghĩa trong chuẩn.

Điều này chỉ cần tính 6 và 8 điểm tương ứng. Những điểm này có thể được tính toán từ cách tính IDCT sửa đổi bằng cách sử dụng phương pháp Lee-style : phân tích các biến đổi 6 và 18 điểm thành các nhân IDCT 3, 4 và 5 điểm.

Phép biến đổi 6 điểm của khối ngắn được phân tích thành 2 phép biến đổi 3 điểm có thể được ước lượng trực tiếp .

Phép biến đổi 18 điểm cho khối dài cũng được phân tích theo mô hình tương tự thành hai phần 9 điểm. Các phần 9 điểm này sau đó được tách ra nữa thành một phần 4 điểm và một phần 5 điểm để được ước lượng cách trực tiếp.

5. Băng lọc đa pha ( Polyphase Filterbank)

• Định nghĩa :

Tần lọc đa pha chuyển đổi các mẫu trong miền thời gian từ phép biến đổi IMDCT trong mỗi subband thành mẫu PCM. Sự chuyển đổi gần 3 bước sau đây:

 Ma trận các mẫu của 32 subband sinh ra 64 giá trị vector V

 Tiến hành cửa sổ của mẫu được chọn từ cơ chế vào trước ra trước (FIFO) của vector V với một cửa sổ không đổi D sinh ra một vector W

 Tổng cộng vector W với chính nó sinh ra 32 mẫu PCM đầu ra .

Bước 2 và 3 ở trên thì dễ thực hiện, đặc biệt trong DSP do nó có khả năng định vị địa chỉ đặc biệt. Bước 1 cũng dễ thực hiện do nó được định nghĩa bởi chuẩn :

Dưới đây là hai cách tính dùng cho bước 1 • Tính toán trực tiếp :

Sự tính toán trực tiếp của thao tác ma trận thì dễ thực hiện bởi nó chỉ bao gồm hai vòng lặp for.

• Thực hiện DCT nhanh 32 điểm ( 32 – point fast DCT implementation):

Konstantinides đã chỉ ra trong chuẩn [2] rằng thao tác ma trận trong bước 1 có thể được cải tiến thực tế bằng cách dùng biến đổi DCT nhanh 32 điểm và một vài thao tác sao chép dữ liệu :

Sự thể hiện đối xứng trong thao tác ma trận

Một trong những giải thuật DCT nhanh thông dụng dùng cho 2m điểm được mô tả bởi tác giả Lee trong [3]. Phép biến đổi được phân tích thành 2 phần chẳn lẻ:

Giải thuật DCT nhanh của Lee

Các phần chẳn và lẻ lại có thể được phân tích theo cách tương tự cho đến khi các phần đủ nhỏ để có thể tính toán thông qua sự ước lượng trực tiếp. Ví dụ như khi N = 2.

PHẦN 2: XÂY DỰNG PHẦN MỀM

CHƯƠNG I : GIAO DIỆN VÀ THUYẾT MINH CHƯƠNG TRÌNH

Giao diện là công cụ trợ giúp đắc lực cho người sử dụng. Những phần mềm có giao diện tốt luôn được ưa chuộng. Đó cũng chính là ưu điểm tuyệt vời của Windows.

Lập trình trong Windows hỗ trợ những công cụ cho phép ta tạo ra những giao diện rất dễ dàng và bắt mắt. Tuy nhiên, thiết kế giao diện để cho ai cũng có thể sử dụng được và không bị nhầm lẫn không phải là chuyện dễ dàng. Nó đòi hỏi ta phải có một cái nhìn bao quát, thậm chí phải hiểu sâu về giải thuật của chương trình thì mới có thể loại trừ những sai lầm khi sử dụng.

Lập trình trong Windows là lập trình theo tình huống. Mọi nút nhấn, ô đối thoại trên giao diện đều có thể được truy cập tới bất kỳ lúc nào mà không theo một trình tự nhất định.

1. Thanh SkinProgress

Thanh này dùng để hiển thị tên bài hát và tên ca sĩ hát bài hát này, bởi vì đây là chương trình nghe nhạc mp3 nên đuôi mặc định là “.mp3” .

2. Nút Minimize

Nút này có tác dụng thu nhỏ cửa sổ chương trình và hiển thị trên thanh Toolbars. Khi cần phóng to cửa sổ lên chỉ cần nhấp chuột vào phần thu nhỏ trên thanh Toolbars .

3. Nút Colse

Dùng để đóng cửa sổ chương trình .

4. Timer

Hiển thị thời gian đã thực thi chương trình dưới dạng “phút : giây”.

5. Tổng thời gian

Hiển thị tổng số thời gian mà chương trình phải thực thi, dưới dạng “phút : giây”.

6 .Nút Open

Mở ra danh sách các bài hát cho người sử dụng chọn lựa (chỉ chọn được 1 bài hát). Do có sử dụng hiệu ứng di chuyển chuột nên khi rà chuột đến nút Open sẽ chuyển sang màu vàng . Khi đã chọn 1 bài hát cụ thể nào đó thì 3 nút còn lại Play, Pause, Stop mới có tác dụng ( lúc khởi động chương trình do chưa chọn bài hát nên 3 nút này không nhấn được).

7 .Nút Play

8. Nút Pause

Tạm dừng chương trình đang hát , để tiếp tục hát ta nhấn nút Play.

9. Nút Stop

Dừng chương trình đang hát, để phát lại bài hát mới ta chọn tên bài hát từ nút Open, sau đó nhấn nút Play.

10. Thanh tiến trình

Hiển thị tiến trình thực thi bài hát. Lúc bài hát kết thúc cũng là lúc thanh tiến trình này lấp đầy. Khi kích chuột đến đâu thì thực thi bài hát tại thời điểm vừa kích chuột .

11. Nút Volume

Dùng để điều chỉnh âm thanh lớn hay nhỏ tuỳ theo nhu cầu của người sử dụng( điều chỉnh vòng tròn càng to thì âm thanh càng lớn).

CHƯƠNG II : LƯU ĐỒ GIẢI THUẬT VÀ CẤU TRÚC DỮ LIỆU LIỆU

I. SƠ ĐỒ KHỐI

Start Init_ MPEGDecoder()

Khởi tạo input stream record

Chuẩn bị vùng đệm

Chuẩn bị thiết bị phát S

Đ

Thay đổi hay giữ nguyên cấu hình InitStream() Reset vị trí dòng bit về zero Reset_Stream() Đặt input file;

Mở input file và kiểm tra OpenNew();

Lấy vào cấu hình mặc định

Dùng bảng mã Huffman để giải mã dòng bit,thông tin dữ liệu và

hệ số tỉ lệ III_scale_factor_1() III_scale_factor_2() III_side_info_1() memset() ReadFrame()<>0 Reset thiết bị phát Kết thúc do_layer3() AudioFlush()

Qua biến đổi IMDCT

II. LƯU ĐỒ GIẢI THUẬT

Lưu đồ giãi thuật của tần lọc đa pha khi tổng hợp subband (Subband Synthesis) dùng phép biến đổi cosin rời rạc nhanh 32_điểm (32_point Fast DCT )

Giải mã âm thanh III_i_stereo()

Lượng tử hóa lại và sắp xếp lại thông tin dữ liệu

III_dequantize_sample() III_dequantize_sample_ms()

Giảm bớt biệt danh III_antialias() Tổng hợp lại các tầng lọc đa pha SynthesisFilterInit() Đưa ra thiết bị phát (right+left)

S Đ

S

Đ

Sk = Các mẫu subband (Subband Samples)

Begin i=0 k=0 i<3 End k<3 V’i =∑ = 31 0 k Skcos[π/64(2k-1)i] k++ i++

Sơ đồ giải thuật của tần lọc đa pha sau khi tổng hợp 32 subband : S Đ S Đ

Sk = Các mẫu subband (Subband Samples)

III. CẤU TRÚC DỮ LIỆU 1. File Agrs.h 1. File Agrs.h

a. L ớp MPArgs

Sử dụng : khai báo các biến cần thiết cho quá trình lấy file vào , xuất file ra thiết bị phát , truy xuất các thông tin về cấu hình file. Vị trí player hiện tại trong frame, vị trí bắt đầu khung, kết thúc khung. Ngoài ra còn lưu trữ tốc độ lấy mẫu, kích thước buffer.

Begin i=0 k=0 i< End k<3 Vi =∑ = 31 0 k Skcos[(16+i)(2k+i)π/64] k++ i++

class MPArgs { public:

unsigned long CurrentPos; // Vị trí player hiện tại trong frames

unsigned long StartFrame, StartPos, EndFrame, EndPos;

unsigned long SampleRate; // Tốc độ lấy mẫu

unsigned long BufferSize; // Kích thước của buffer xuất unsigned long Buffers; // Số buffers

long Channels; // Channels(1=mono;2=stereo)

long AudioBits; // Số Bits trên sample(mẫu) ví dụ 16 bit

long AudioDevice; // Số thiết bị audio sẽ được mở ra long AudioMode; // Kiểu Audio (ví dụ 16bit tín hiệu) long ScaleFactor; // Hệ số tỉ lệ output

long ForceFreq;

bool TryResync; // Resync on bad data? bool Seekable;

bool IsVBR; //Dùng xác định chiều dài của stream

bool UseHdrCB; // Dùng xuất ra header char *InName; // Đưa tên file vào stream char *OutName; // Xuất ra tên file

long OutDeviceNum; // Số thiết bị xuất ra MMSystem long ForceMono; // Force mono output?

long Force8bit; // Force 8-Bit output? long ForceStereo; // Force stereo output? long DownSample; //

long PlayPriority; // thực thi thread ưu tiên void *Player; void *Decoder; esInputMode InputMode; esOutputMode OutputMode; WaveOutCB BufferCB; WaveOutActionCB OutActionCB; InFileOpenCB InOpenCB; InFileCloseCB InCloseCB; InFileGetSizeCB InGetSizeCB; InFileSeekCB InSeekCB;

InFileReadCB InReadCB;

// Người dùng định nghĩa dữ liệu xuất unsigned long OutCBData;

// Người dùng định nghĩa dữ liệu nhập unsigned long InCBData1;

unsigned long InCBData2; HWND wnd;

//Gán các hằng cho các đối tượng MPArgs() { InName = NULL; OutName= NULL; OutDeviceNum = 0; BufferedInput = true; CurrentPos = 0; StartPos = 0; EndPos = 0; DownSample = 0; ForceStereo = 0; AudioBits = 16; SampleRate = 44100; Channels = 2; AudioMode = 1; AudioDevice = 0; BufferSize = 16384; Buffers = 8; BufferCB = NULL; UseHdrCB = false; TryResync = TRUE; Seekable = true; Force8bit = 0; ForceFreq = -1; ForceMono = 0; ScaleFactor = 32768; PlayPriority= THREAD_PRIORITY_NORMAL; OutCBData = 0; InCBData1 = 0; InCBData2 = 0;

OutActionCB = NULL; BufferCB = NULL; wnd = 0; } ~MPArgs() { if (InName) free(InName); if (OutName) free(OutName); } }; b. Cấu trúc MPInfo

Lưu trữ các thông tin về header của frame. struct MPInfo { long stereo_mode; long layer; long bitrate; long frequency; }; c. Cấu trúc frame

Sử dụng lưu trữ các thông tin về header của file như: syncword, id, layer, error protection,bitrare index, sampling frequency, padding bit, private bit, mode, mode extension, copyright, emphasis, original/copy.

struct frame { synthProc synth; synth_monoProc synth_mono; long stereo; long jsbound; long single; long II_sblimit; long lsf; long mpeg25; long down_sample;

long header_change; unsigned long block_size; long lay; long WhatLayer; long error_protection; long bitrate_index; long sampling_frequency; long padding; long extension; long mode; long mode_ext; long copyright; long original; long emphasis; }; 2. File Common.h

Trong chương trình các cấu trúc này dùng ở giai đoạn lấy thông tin dữ liệu vào giải mã thông tin các thông tin cần thiết như :hệ số tỉ lệ ,lượng tử hóa lại các mẫu , âm thanh (stereo), giảm bớt biệt danh.

a. Cấu trúc ID3TagStruct struct ID3TagStruct { char TagHeader[3]; char Title[30]; char Artist[30]; char Album[30]; char Year[4]; char Comment[30]; unsigned char Genre;

};

b. Cấu trúc gr_info_s

Lưu trữ các thông số về phương pháp mã hoá Huffman. struct gr_info_s {

unsigned part2_3_length; unsigned big_values; unsigned scalefac_compress; unsigned block_type; unsigned mixed_block_flag; unsigned table_select[3]; unsigned subblock_gain[3]; unsigned maxband[3]; unsigned maxbandl; unsigned maxb; unsigned region1start; unsigned region2start; unsigned preflag; unsigned scalefac_scale; unsigned count1table_select; real *full_gain[3]; real *pow2gain; }; c. Cấu trúc bandInfoStruct struct bandInfoStruct { int longIdx[23]; int longDiff[22]; int shortIdx[14]; int shortDiff[13]; }; d. Cấu trúc III_sideinfo struct III_sideinfo { unsigned main_data_begin; unsigned private_bits; struct { struct gr_info_s gr[2]; } ch[2]; }; 3. File Elsound.h

Dùng các cấu trúc này trong chương trình để lưu trữ các biến điều khiển và các biến dùng để lưu trữ lỗi. Ngoài ra còn lưu trữ mode hiện tại là Closed, Opened,Ready, Stopped, Playing, Change, Paused để hiểu được chương trình đang xử lý ở trạng thái nào.

a. Cấu trúc esInputMode enum esInputMode { imFile, imCallback }; b. Cấu trúc esOutputMode enum esOutputMode { omMMSystem, omWaveFile, omDirectSound, omCallback }; c. Cấu trúc esPlayerMode enum esPlayerMode { pmClosed, pmOpened, pmReady, pmStopped, pmPlaying, pmChange, pmPaused }; d. Cấu trúc esPlayerError enum esPlayerError { peNoError,

peIncorrectMode, // không đúng mode cho việc thực thi hoạt động

peInternalError, // không cấp phát được nguồn tài nguyên hoặc resource

peInvalidHandle, // xử lý đối tượng player sai peInputError, peOutputError, peNoMemory, peNoResources, peNoCallback }; 4. File Huffman.h

Sử dụng trong quá trình giải mã theo giải thuật Huffman gồm: bảng Huffman, linbit.

struct newhuff

{

unsigned int linbits;

Một phần của tài liệu Kỹ thuật mã hóa thụ cảm (Trang 48)

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

(73 trang)
w