Bảng 2 .1 Kết quả mã hóa các kí tự bằng mã Huffman
Bảng 2 .2 Mô tả chân I2C bus
Kênh Tên chân I/O Chức năng
0 I2C0_SCL Input/Output Chân xuất/nhập clock I2C0_SDA Input/Output Chân xuất/nhận dữ liệu
2.5.1 Module giao diện âm thanh nối tiếp
Module giao diện âm thanh nối tiếp là một module được thiết kế để nhận hoặc để gửi dữ liệu âm thanh, tương tác với các thiết bị khác nhau mà hổ trợ định dạng thích hợp theo Philips. Nó cũng hổ trợ thêm các chế độ cho những định dạng phổ biến như là burst và chế độ đa kênh (mutil – channel).
• Các đặc tính:
SSI có các đặc tính sau:
Các chế độ hoạt động: chế độ nén (compressed mode) và chế độ không nén (non – compressed mode). Chế độ nén được sử dụng cho cho việc truyền các chuổi bit liên tục. Chế độ không nén hổ trợ cho tất cả các chuổi âm thanh nối tiếp được phân chia cho các kênh.
Module SSI được cấu hình như bất kỳ một bộ truyền hay bộ nhận nào. Định dạng
bus nối tiếp có thể được sử dụng trong chế độ nén và chế độ không nén.
Truyền bất đồng bộ giữa buffer và các thanh ghi dịch (shift register).
Sự phân chia tỷ lệ của bus nối tiếp kết nối với đồng hồ (clock) có thể lựa chọn
được.
Dữ liệu truyền/nhận có thể được điều khiển bởi DMAC hoặc các ngắt (interrupt).
• Sơ đồ khối :
Hình 2.8: Sơ đồ khối SSI
2.5.2 Các chân output/input Bảng 2.3 Mô tả chân SSI bus
0
SSI_SCK0 Input/Output Clock bit nối tiếp
SSI_WS0 Input/Output Chọn từ
SSI_SDATA0 Input/Output Dữ liệu I/O nối tiếp
HAC_BIT_CLK0 Input Chia clock đầu vào
1
SSI_SCK1 Input/Output Clock bit nối tiếp
SSI_WS1 Input/Output Chọn từ
SSI_SDATA1 Input/Output Dữ liệu I/O nối tiếp
HAC_BIT_CLK1 Input Chia clock đầu vào
2.6 Driver âm thanh
2.6.1 Sơ đồ hoạt động
Hình 2.9: Hoạt động của driver âm thanh
2.6.2 Cấu trúc dữ liệu
R Read W Write R/W Read/Write typedef enum { /* no common attribute */ /* specific attribute */ DN_AUDIO_GETAVAILABLEFMTS= -100, DN_AUDIO_SETTINGFMTS= -101, DN_AUDIO_PLAYSTATE= -102, DN_AUDIO_GETPLAYINGPOS= -103, DN_AUDIO_PLYBUFSZ= -104, DN_AUDIO_PLAYAUDIO = -105, DN_AUDIO_MIXEROUTPUTVOL= -106, DN_AUDIO_REC_BUFSZ = -107, DN_AUDIO_REC_CTRL = -108, DN_AUDIO_REC_AMPL = -109, DN_AUDIO_REC_GET_BUF= -110, DN_AUDIO_DRV_MBF= -111, } AudioDataNo;
DN_AUDIO_SETTINGFMTS: Thuộc tính này có thể đọc hoặc thiết lập định dạng audio hoạt đông cho driver với 2 hàm tk_rea_dev() và
tk_swri_dev().
Kiểu struct : AudioFMTS
Cấu trúc AudioFMTS được định nghĩa như sau: typedef struct {
UW sampling:16; /* Tần số mẫu */
UW datafmt:8; /* Số bit trên 1 mẫu*/
UW monoply:1; /* Phát monoral*/
UW stereoply:1; /* Phát stereo*/
UW monorec:1; /* Thu monoral */
UW stereorec:1; /* Thu stereo */
UW recply:1; /* Thu/Phát */
UW reserved:3; /* Dự trữ*/
} AudioFMTS;
DN_AUDIO_PLAYSTATE: Thuộc tính cho phép đọc và điều khiểu trạng thái hoạt động của driver với 2 hàm hàm tk_rea_dev() và tk_swri_dev().
Định nghĩa tín hiệu truyền cho driver #define AUDIO_STOP 0 /* stop */ #define AUDIO_PAUSE 1 /* pause */ #define AUDIO_RUN 2 /* run */
DN_AUDIO_PLYBUFSZ: Thuộc tính cho phép đọc và thiết lập kích thước của buffer driver với 2 hàm tk_rea_dev() và tk_swri_dev().
DN_AUDIO_PLAYAUDIO: Thuộc tính cho phép ghi dữ liệu lên vào buffer driver với hàm tk_swri_dev().
DN_AUDIO_MIXEROUTPUTVOL: Thuộc tính cho phép điều chỉnh và lấy dữ liệu của loa.
Struct: MixerLineVolume.
Cấu trúc AudioFMTS được định nghĩa như sau: typedef struct {
UB lineId;// line ID
UB time; // thời gian thai đổi giá trị volume [ms]
H vol[2];// Giá trị volume với vol[0]: kênh trái
// vol[1]: kênh phải
} MixerLineVolume; lineId:
#define MIXER_LINEID_MASTEROUT 0 //The output master volume
#define MIXER_LINEID_PCMOUT 1 //PCM volume
#define MIXER_LINEID_MICIN 2 //Microphone volume
DN_AUDIO_DRV_MBF: Thuộc tính cho phép tạo, xóa message buffer của driver với hàm tk_rea_dev() và tk_swri_dev(). Message buffer này có nhiệm vụ thông báo trạng thái của buffer driver tới các task nhận.
Dữ liệu:
#define MSG_DRV_ENABLE_HALF -1
// Cho phép chép vào 1 nữa buffer driver #define MSG_DRV_END_BUFFER -2
// Thông báo rằng driver đã chơi hết dữ liệu trong buffer #define MSG_DRV_STOP_BUFFER -3
CHƯƠNG 3: TỔNG QUAN VỀ FILE FLAC (FREE LOSSLESS AUDIO CODEC)
3.1 Một vài chuẩn lossless
Gần đây, với sự phát triển mạnh mẽ của nhạc số, bên cạnh các chuẩn nén mất dữ liệu (lossly) phổ biến như MP3, WMA, … thì các chuẩn nén không mất dữ liệu (lossless) như FLAC, APE , WV… ngày càng được ưa chuộng hơn vì chất lượng âm thanh được đảm bảo so với âm thanh gốc mà dung lượng lại được giảm đáng kể, chỉ khoảng 30% đền 40% dung lượng của âm thanh gốc.
Một vài chuẩn lossless thường gặp.
3.1.1 APE (Monkey’s Audio)
Đuôi mở rộng là .ape
Là một trong những chuẩn nén không mất dữ liệu, có kích thước dung lượng khoảng 3-5 lần so với một file MP3 bitrate 192kbps, vì là lossless nên chất lượng tương đương với âm thanh gốc.
Mặc dù được phân phối như một phần mềm miễn phí nhưng APE lại không được sử dụng rộng rãi do trong source code của nó có thêm các license để ngăn chặn hầu hết các phiên bản của LINUX và các phần mềm miễn phí khác.
3.1.2 WV(WavPack) :
Đuôi mở rộng là .wv
Là một chuẩn nén lai, kết hợp giữa lossy và lossless. Chuẩn này tạo ra 2 file, một file tương đối nhỏ, chất lượng cao và mất dữ liệu. File còn lại là file hiệu chỉnh, được sử dụng kết hợp với file kia, nhằm cung cấp đầy đủ thông tin để khôi phục dữ liệu ban đầu.
Tuỳ thuộc vào file âm thanh gốc mà tỉ lệ nén có thể dao động từ 30% - 70%.
3.1.3 FLAC (Free Lossless Audio Codec)
Giống APE, là một chuẩn nén không mất dữ liệu, mục tiêu là giảm dung lượng lưu trữ và yêu cầu về đường truyền mà không làm mất đi chất lượng âm thanh.
FLAC là một chuẩn miễn phí, tự do nên được hỗ trợ trên hầu hết các phiên bản của LINUX và một số các phần mềm nghe nhạc miễn phí.
So với 2 chuẩn trên thì FLAC phổ biến rộng rãi hơn và được người dùng ưa chuộng hơn.
3.2 Giới thiệu về file FLAC - Free Lossless Audio Codec
Là một chuẩn nén âm thanh không mất dữ liệu, được nghiên cứu và phát triển bởi Josh Coalson và Ed Whitney từ năm 2000.
FLAC hỗ trợ mã hóa được các âm thanh gốc PCM với tần số lấy mẫu từ 1 đến 655350 Hz, với số bit trên một mẫu là 8, 16, 24, với số kênh từ 0 đến 8.
FLAC sử dụng CRC checksum để kiểm tra các frame lỗi trong một giao thức truyền, và có một hash MD5 của các mẫu âm thanh gốc PCM được lưu trong header của STREAMINFO.
FLAC cho phép các tham số Rice codes là từ 0 đến 16. Cấu trúc cơ bản của file FLAC
Bốn byte xác định định dạng của file là “FLAC”.
Metadata block STREAMINFO chứa các thông tin cơ bản của file.
Không có hoặc nhiều metadata block khác.
Một hay nhiều audio frame.
3.2.1 Metadata
FLAC có nhiều loại metadata block. Các metadata block có thể có chiều dài bất kì. Một bộ giải mã được cho phép có thể bỏ qua bất kì một loại metadata nào mà nó không đọc được, trừ STREAMINFO.
STREAMINFO chứa các thông tin cơ bản của một file nhạc như tỉ lệ mẫu (sample rate), số kênh (channels), số bit trên một mẫu (bit per sample)....
Ngoài ra còn có block khác cần thiết cho việc đệm dữ liệu, tìm kiếm bảng, các ứng dụng dữ liệu cụ thể, và có các tùy chọn (flac options) để thêm vào block PADDING hay chỉ định việc tìm kiếm điểm, hoặc được sử dụng trong các ứng dụng chỉnh sửa.
3.2.2 Audio data
Theo sau các metadata block là các dữ liệu audio đã được mã hóa (audio data). Audio data và metadata không được xen kẽ nhau. Giống như hầu hết các chuẩn khác, FLAC cũng chia các dữ liệu âm thanh thô ra làm nhiều block và thực hiện mã hóa trên từng block. Mỗi block mã hóa được đóng gói thành một frame và được gắn vào stream.
3.2.3 Frame
Một audio frame được xác định bởi một frame header ở đầu và một frame footer ở cuối. Header bắt đầu với một sync code, và chứa thông tin cần thiết để bộ giải mã có thể chơi nhạc, như tần số lấy mẫu, số bit trên một mẫu.... Nó cũng chứa các block hay số sample và 8 bit CRC của frame header. Sync code, frame header CRC và số block/số sample cho phép đồng bộ và tìm kiếm các seek point. Frame footer chứa 16 bit CRC của frame được mã hoá để phát hiện lổi. Nếu bộ giải mã phát hiện một CRC lỗi, nó sẽ tạo ra một block câm.
3.3 Quá trình mã hóa file FLAC
Giống như nhiều bộ mã hóa âm thanh khác, bộ mã hóa file FLAC cũng chia quá trình mã hóa thành các giai đoạn: blocking, interchannel decorrelation, prediction và residual coding.
3.3.1 Định nghĩa
Block: một hay nhiều mẫu âm thanh trên nhiều kênh.
Subblock: Một hay nhiều mẫu âm thanh trên một kênh. Vì vậy một block chứa một subblock của mỗi kênh và tất cả subblock chứa cùng một số mẫu.
Frame: gồm frame header và một hay nhiều subframe
Subframe: Gồm subframe header cộng với một hay nhiều mẫu được mã hoá từ một kênh xác định. Tất cả subframe trong cùng một frame sẽ chứa cùng một số mẫu.
3.3.2 Blocking
File input sẽ được chia làm nhiều block. Trong FLAC, các block có thể có kích thước khác nhau. Kích thước tối ưu của block thường chịu ảnh hưởng từ nhiều yếu tố khác nhau như tần số lấy mẫu …Mặc dù FLAC cho phép kích thước của block có thể khác nhau trong cùng một stream (một file) nhưng thường những bộ mã hoá vẫn sử dụng một kích thước block cố định.
Hiện tại bộ mã hoá sử dụng một block size cố định, tối ưu dựa trên sample rate (tần số lấy mẫu) của input. Trong tương lai, block size có thể thay đổi dựa trên đặc điểm của tín hiệu.
Kích thước của một block (block size) là một tham số quan trọng trong việc mã hóa, nó ảnh hưởng trực tiếp đến tỷ lệ nén. Nếu block size quá nhỏ, kết quả sẽ có một lượng lớn frame được tạo ra, dẫn đến tốn nhiều dung lượng để lưu trữ các frame header, đôi khi dữ liệu đó còn nhiều hơn phần dữ liệu được nén.
Nếu block size quá lớn, đặc điểm chung của các tín hiệu sẽ phức tạp hơn, do đó bộ mã hoá sẽ khó có thể tìm được một dự đoán tốt. Để đơn giản hoá cho quá trình mã hoá cũng như giải mã, FLAC quy ước block size nhỏ nhất là 16 sample, và block size lớn nhất là 65535 sample.
Dữ liệu được phân chia thành các block để chuyển qua giai đoạn dự đoán, mỗi subblock cho mỗi kênh và trong cùng một thời gian. Mỗi subblock được mã hoá độc lập thành một subframe và các subframe nối với nhau tạo thành một frame. Bởi vì mỗi kênh được mã hoá riêng biệt, nên một kênh của một stereo frame được mã hoá như một constant subframe và một kênh khác là LPC subframe.
Hiểu biết về mô hình FLAC sẽ giúp cải thiện chất lượng nén cho nhiều loại input khác nhau bằng cách thay đổi kích thước block cho phù hơp.
Trong trường hợp phổ biến nhất, sử dụng dự đoán tuyến tính trên âm thanh 44.1KHz, kích thước của một block lí tưởng khoảng từ 2 đến 6 Ksamples. Mặc định kích thước của block trong trường hợp này là 4096 sample.
3.3.3 INTER CHANNEL DECORRELATION
Trong trường hợp input là các âm thanh nổi (stereo), mỗi lần dữ liệu được chia thành block, nó phải thông qua một giai đoạn gọi là “Inter channel decorrelation”.
Ở giai đoạn này, bộ giải mã cần tạo ra tín hiệu giữa và bên (mid –side signal) trên cơ sở trung bình cộng và sự chênh lệch giữa hai kênh trái và phải :
mid = (left + right)/2 side = left - right
Trong dòng âm thanh nổi (stereo stream), số lượng khai thác mối tương quan giữa hai kênh trái và phải diễn ra nhiều lần. FLAC cho phép các frame của stereo stream có kênh khác nhau, và một bộ mã hóa có thể chọn một đại diện tốt nhất trên cơ sở frame by frame.
Independent: kênh trái và phải được mã hoá độc lập.
Mid-side: Kênh trái và phải được chuyển sang kênh giữa và kênh bên cạnh (side
channel). Kênh giữa là trung bình cộng của tín hiệu hai kênh, và kênh bên cạnh là sự chênh lệch giữa tín hiệu hai kênh.
Left-side: kênh trái và kênh side được mã hoá.
Right-side: kênh phải và kênh side được mã hoá.
Dạng left-side và right-side có thể xem là hiệu quá trong nhiều frame, thậm chí mặc dù số bit trên một mẫu của tín hiệu gốc là nhiều hơn so với dạng independent hay dạng mid-side.
3.3.4 Prediction
Trong giai đoạn tiếp theo, bộ mã hóa cố gắng để phỏng đoán các tín hiệu xấp xỉ với tín hiệu gốc, khi sự phỏng đoán là gần đúng, sự sai khác (được gọi là residual, residue hay error) chỉ cần một số lượng bit nhỏ hơn số bit trên một mẫu để lưu chúng lại.
Khi một block được chuyển vào giai đoạn prediction - dự đoán, bộ mã hoá sẽ tìm một mô tả toán học (thường là một phỏng đoán) của tín hiệu. Khi phương pháp dự đoán này được bộ mã hoá và giải mã cùng biết, thì chỉ cần tham số dự đoán được gắn vào dòng nén (compressed stream).
FLAC hiện tại sử dụng bốn phương pháp dự đoán tương đương với bốn loại subframe, nhưng định dạng của nó cho phép bổ sung vào các phương pháp khác được tìm thấy sau này.
Bốn loại đó là: α. Verbatim
Bản chất của phương pháp này là dự đoán tuyến tính với bậc LPC bằng 0. tức tín hiệu được dự đoán bằng 0, residual sẽ bằng chính tín hiệu gốc và tỉ lệ nén sẽ là 0. Phương pháp này là cơ sở của các phương pháp dự đoán khác. Nếu đưa một dữ liệu ngẫu nhiên vào mã hoá, dự đoán verbatim sẽ hữu dụng cho mỗi subblock. Khi tín hiệu gốc không thực sự chuyển vào giai đoạn residual coding (nó được thêm vào stream verbatim), kết quả của quá trình mã hoá sẽ không giống như dự đoán tuyến tính với order 0.
β. Constant
Dự đoán này được sử dụng ở bất kì nơi nào mà các subblock là “pure”, nghĩa là giá trị của các mẫu là không đổi. Tín hiệu chạy trong suốt chiều dài mã hoá và được thêm vào stream.
χ. Fixed linear predictor
FLAC sử dụng một lớp của dự đoán tuyến tính cố định. FLAC bổ sung thêm bậc LPC thứ tư thay vì bậc LPC từ 0 đến 3 như Shorten .Khi dự đoán là cố định, bậc LPC chỉ
là một tham số cần được lưu trong dòng nén (compressed stream). Tín hiệu lỗi (error signal) được chuyển sang giai đoạn residual coder.
δ. FIR linear prediction
Đối với mô hình chính xác hơn (mã hóa chậm hơn), FLAC hỗ trợ FIR linear prediction lên đến cấp LPC thứ 32. Bộ mã hóa sử dụng hàm Levinson -Durbin để tính toán các hệ số LPC từ các hệ số tương quan và các hệ số được lượng trước khi tính toán số dư (residual). Trong khi bộ mã hóa như Shorten thường sử dụng một lượng cố định cho toàn bộ input, FLAC cho phép hệ số lượng tử chính xác thay đổi từ subframe này đến subframe khác. Bộ mã hóa FLAC ước lượng sự chính xác tối ưu để sử dụng dựa vào kích thước block và phạm vi động của tín hiệu gốc.
3.3.5 Residual Coding
Một khi mô hình được tạo ra, bộ mã hóa phỏng đoán các tín hiệu xấp xỉ với tín hiệu gốc, sự sai lệch giữa chúng gọi là residual (error) signal. Tín hiệu lỗi (residual signal) này chính là losslessly coded.
Các mẫu trong residual được giả định là không tương quan và được mã hóa một cách độc lập.
Vấn đề mã hóa lỗi là tìm được một dạng thích hợp cho mật độ xác xuất và chức năng của sự phân phối các giá trị lỗi. Vì vậy, chúng mới có thể được mô hình một cách hiệu quả.
FLAC lợi dụng thực tế là các tín hiệu lỗi thường có một phân phối Laplacian (2 mặt hình học) và một bộ mã đặc biệt (Huffman) -được gọi là Rice code- sử dụng để mã hóa tín hiệu nhanh chóng hiệu quả.