Vì file FLAC có dung lượng khá lớn nên phải nghiên cứu giải thuật đồng bộgiữa các quá trình đọc file, giải mã, đẩy dữ liệu ra buffer driver và điều khiển driverphát nhạc để đảm bảo chất
Trang 1ĐẠI HỌC QUỐC GIA TP HCM TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC & KĨ THUẬT MÁY TÍNH
LUẬN VĂN TỐT NGHIỆP ĐẠI HỌC
XÂY DỰNG CHƯƠNG TRÌNH CHƠI NHẠC
FLAC TRÊN T-ENGINE BOARD
HỘI ĐỒNG: KỸ THUẬT MÁY TÍNH GVHD:ThS PHAN ĐÌNH KHÔI GVPB: ThS BÙI VĂN HIẾU
SVTH 1: VÕ NGUYÊN TRUNG (5060 ) SVTH 2: LÊ THỊ THANH HÀ (50600572)
-o0o -TP.HỒ CHÍ MINH, THÁNG 1 NĂM 2011
i
Trang 2LỜI CAM ĐOAN
o0o Chúng em xin cam đoan rằng, ngoại trừ các kết quả tham khảo từ các công trìnhkhác như đã ghi rõ trong luận văn, nội dung trình bày trong luận văn này là do chínhchúng em thực hiện và chưa có phần nào của luận văn này được nộp để lấy một bằngcấp ở trường Bách Khoa hoặc trường khác
-Tp Hồ Chí Minh, ngày 07 tháng 01 năm 2011
Nhóm sinh viên
Võ Nguyên Trung – Lê Thị Thanh Hà
ii
Trang 3Ngoài ra, chúng em cũng gửi lời cảm ơn đến các nhóm bạn cũng trao đổi, chia
sẻ kiến thức giúp chúng em hoàn thành luận này một cách tốt đẹp nhất
Cuối cùng, chúng em xin cảm ơn Công ty Renesas đã hỗ trợ cho khoa KhoaHọc và Kỹ Thuật Máy Tính cũng như Câu lạc bộ Phần Cứng board và tài liệu T-Engine tạo điều kiện cho chúng em nghiên cứu và thực hiện đề tài
iii
Trang 4TÓM TẮT LUẬN VĂN
o0o
-Nội dung của đề tài là tìm hiểu về định dạng file FLAC, thực hiện giải mã filenày và xuất ra cổng audio của T Engine board Sau đó, tìm hiểu và phát triển driver âmthanh trên T Engine board để điều khiển trình chơi nhạc
Vì file FLAC có dung lượng khá lớn nên phải nghiên cứu giải thuật đồng bộgiữa các quá trình đọc file, giải mã, đẩy dữ liệu ra buffer driver và điều khiển driverphát nhạc để đảm bảo chất lượng âm thanh là tốt nhất với những đáp ứng của phầncứng
Trên cơ sở đó, xây dựng giao diện chương trình chơi nhạc định dạng file FLAC
và các file khác như MP3, WAV trên T Engine board Giao diện này sẽ có đầy đủ cáctính năng của một trình nghe nhạc thông dụng
iv
Trang 5MỤC LỤC
LỜI CAM ĐOAN ii
LỜI CẢM ƠN iii
TÓM TẮT LUẬN VĂN iv
MỤC LỤC v
MỤC LỤC HÌNH viii
MỤC LỤC BẢNG ix
CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 1
1.1Giới thiệu 1
1.2Ứng dụng 2
1.3Các vấn đề của đề tài 2
1.4Hướng giải quyết 2
1.4.1Cấu trúc của file FLAC 2
1.4.2Giải mã file FLAC 3
1.4.3Driver âm thanh 3
1.4.4Xây dựng giao diện đồ hoạ 3
1.4.5Bổ sung các loại file khác 3
1.5Nội dung báo cáo 3
CHƯƠNG 2: KIẾN THỨC NỀN TẢNG 5
2.1 Dự đoán tuyến tính LPC(Linear predictive coding) 5
2.2 Mã Huffman 6
2.2.1Biểu diễn mã tiền tố trên cây nhị phân 7
2.2.2Xây dựng bộ mã tiền tố tối ưu 7
2.2.3 Hàng đợi ưu tiên: 8
2.2.4Xây dựng cây Huffman: 8
2.2.5Xây dựng bộ mã 8
2.2.6Nén file bằng mã Huffman 8
2.3Rice Coding 10
2.3.1Mã Golomb 10
2.3.2Mã Rice: 11
2.3.3Ứng dụng: 13
v
Trang 62.4Sơ lược về bộ tổng hợp âm thanh của T-Engine 13
2.4.1Sơ đồ khối 13
2.4.2Các chân kết nối (Connector pins) 14
2.4.3 Audio codec UDA1342TS 15
2.5Giao tiếp I2C Hitachi 17
2.5.1Module giao diện âm thanh nối tiếp 18
2.5.2Các chân output/input 19
2.6Driver âm thanh 20
2.6.1Sơ đồ hoạt động 20
2.6.2Cấu trúc dữ liệu 20
CHƯƠNG 3: TỔNG QUAN VỀ FILE FLAC (FREE LOSSLESS AUDIO CODEC) 27
3.1Một vài chuẩn lossless 27
3.1.1APE (Monkey’s Audio) 27
3.1.2WV(WavPack) : 27
3.1.3FLAC (Free Lossless Audio Codec) 27
3.2Giới thiệu về file FLAC - Free Lossless Audio Codec 28
3.2.1Metadata 28
3.2.2Audio data 29
3.2.3Frame 29
3.3Quá trình mã hóa file FLAC 29
3.3.1Định nghĩa 29
3.3.2Blocking 30
3.3.3INTER CHANNEL DECORRELATION 31
3.3.4 Prediction 32
3.3.5Residual Coding 33
3.4Cấu trúc file FLAC 34
CHƯƠNG 4: XÂY DỰNG CHƯƠNG TRÌNH NGHE NHẠC 41
4.1Giải mã file FLAC 41
4.1.1 Đọc thông tin của file 41
4.1.2Đọc frame, giải mã file FLAC 41
4.1.3Residual coding 47
4.1.4Mã Rice 48
4.2Thiết kế chương trình nghe nhạc 50
vi
Trang 74.2.1Phân tích vấn đề 50
4.2.2Hoạt động của chương trình 51
4.2.3Hiện thực chương trình 54
CHƯƠNG 5:TỔNG KẾT 69
5.1Kết quả thực hiện 69
5.2Thuận lợi và khó khăn 69
5.2.1Thuận lợi: 69
5.2.2Khó khăn: 70
5.3Hướng phát triển 70
TÀI LIỆU THAM KHẢO 71
vii
Trang 8MỤC LỤC HÌNH
LỜI CAM ĐOAN ii
LỜI CẢM ƠN iii
TÓM TẮT LUẬN VĂN iv
MỤC LỤC v
MỤC LỤC HÌNH viii
MỤC LỤC BẢNG ix
CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 1
1.1Giới thiệu 1
1.2Ứng dụng 2
1.3Các vấn đề của đề tài 2
1.4Hướng giải quyết 2
1.4.1Cấu trúc của file FLAC 2
1.4.2Giải mã file FLAC 3
1.4.3Driver âm thanh 3
1.4.4Xây dựng giao diện đồ hoạ 3
1.4.5Bổ sung các loại file khác 3
1.5Nội dung báo cáo 3
CHƯƠNG 2: KIẾN THỨC NỀN TẢNG 5
2.1 Dự đoán tuyến tính LPC(Linear predictive coding) 5
2.2 Mã Huffman 6
2.2.1Biểu diễn mã tiền tố trên cây nhị phân 7
2.2.2Xây dựng bộ mã tiền tố tối ưu 7
2.2.3 Hàng đợi ưu tiên: 8
2.2.4Xây dựng cây Huffman: 8
2.2.5Xây dựng bộ mã 8
2.2.6Nén file bằng mã Huffman 8
Hình 2.1: sơ đồ mã hóa các kí tự bằng mã Huffman 9
2.3Rice Coding 10
2.3.1Mã Golomb 10
Hình 2.2 Mã Golomb 11
Trang 92.3.2Mã Rice: 11
2.3.3Ứng dụng: 13
2.4Sơ lược về bộ tổng hợp âm thanh của T-Engine 13
2.4.1Sơ đồ khối 13
Hình 2.3 Sơ đồ kết nối 13
Hình 2.4 Khối điều khiển tổng hợp âm thanh 14
2.4.2Các chân kết nối (Connector pins) 14
Hình 2.5 Sơ đồ chân của bộ tổng hợp âm thanh 14
2.4.3 Audio codec UDA1342TS 15
Hình 2.6: Sơ đồ khối UDA1342TS 17
2.5Giao tiếp I2C Hitachi 17
Hình 2.7: Sơ đồ kết nối giao tiếp I2C 18
2.5.1Module giao diện âm thanh nối tiếp 18
Hình 2.8: Sơ đồ khối SSI 19
2.5.2Các chân output/input 19
2.6Driver âm thanh 20
2.6.1Sơ đồ hoạt động 20
Hình 2.9: Hoạt động của driver âm thanh 20
2.6.2Cấu trúc dữ liệu 20
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() 22
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() 23
DN_AUDIO_MIXEROUTPUTVOL: Thuộc tính cho phép điều chỉnh và lấy dữ liệu của loa 23
CHƯƠNG 3: TỔNG QUAN VỀ FILE FLAC (FREE LOSSLESS AUDIO CODEC) 27
3.1Một vài chuẩn lossless 27
3.1.1APE (Monkey’s Audio) 27
3.1.2WV(WavPack) : 27
3.1.3FLAC (Free Lossless Audio Codec) 27
3.2Giới thiệu về file FLAC - Free Lossless Audio Codec 28
3.2.1Metadata 28
3.2.2Audio data 29
3.2.3Frame 29
Trang 103.3Quá trình mã hóa file FLAC 29
3.3.1Định nghĩa 29
3.3.2Blocking 30
3.3.3INTER CHANNEL DECORRELATION 31
3.3.4 Prediction 32
a.Verbatim 32
c.Fixed linear predictor 32
d.FIR linear prediction 33
3.3.5Residual Coding 33
3.4Cấu trúc file FLAC 34
Hình 3.1: Cấu trúc của file FLAC 35
Hình 3.2: Cấu trúc của Streaminfo metadata 36
Hình 3.3: Cấu trúc của Application metadata 36
Hình 3.4: Cấu trúc của Seektable metadata 37
Hình 3.5: Cấu trúc của Vorbis_comment metadata 37
Hình 3.6: Cấu trúc của Picture metadata 38
CHƯƠNG 4: XÂY DỰNG CHƯƠNG TRÌNH NGHE NHẠC 41
4.1Giải mã file FLAC 41
4.1.1 Đọc thông tin của file 41
4.1.2Đọc frame, giải mã file FLAC 41
Hình 4.1: Cấu trúc của frame 42
Hình 4.2 : Cấu trúc của Verbatim subframe 44
Hình 4.1 : Cấu trúc của Fixed subframe 44
Hình 4.2: Cấu trúc của LPC subframe 46
4.1.3Residual coding 47
Hinh 4.5: Cấu trúc của Residual (phần dư) 47
4.1.4Mã Rice 48
Hình 4.63 Giải mã residual với tham số Rice là 16 49
Hình 4.4 Giải mã residual với tham số Rice là 4 49
Hình 4.5 Cách lưu dữ liệu với 2 kênh 50
4.2Thiết kế chương trình nghe nhạc 50
4.2.1Phân tích vấn đề 50
4.2.2Hoạt động của chương trình 51
Hình 4.6: Đường đi dữ liệu của chương trình 51
4.2.3Hiện thực chương trình 54
Trang 11Hình 4.70: Hoạt động của main task 55
Hình 4.81: Cấu trúc tổng quát của chương trình 56
a.Usb_task 57
Hình 4.91: Hoạt động của usb_task 57
CHƯƠNG 5:TỔNG KẾT 69
5.1Kết quả thực hiện 69
5.2Thuận lợi và khó khăn 69
5.2.1Thuận lợi: 69
5.2.2Khó khăn: 70
5.3Hướng phát triển 70
TÀI LIỆU THAM KHẢO 71
Trang 12MỤC LỤC BẢNG
LỜI CAM ĐOAN ii
LỜI CẢM ƠN iii
TÓM TẮT LUẬN VĂN iv
MỤC LỤC v
MỤC LỤC HÌNH viii
MỤC LỤC BẢNG ix
CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 1
1.1Giới thiệu 1
1.2Ứng dụng 2
1.3Các vấn đề của đề tài 2
1.4Hướng giải quyết 2
1.4.1Cấu trúc của file FLAC 2
1.4.2Giải mã file FLAC 3
1.4.3Driver âm thanh 3
1.4.4Xây dựng giao diện đồ hoạ 3
1.4.5Bổ sung các loại file khác 3
1.5Nội dung báo cáo 3
CHƯƠNG 2: KIẾN THỨC NỀN TẢNG 5
2.1 Dự đoán tuyến tính LPC(Linear predictive coding) 5
2.2 Mã Huffman 6
2.2.1Biểu diễn mã tiền tố trên cây nhị phân 7
2.2.2Xây dựng bộ mã tiền tố tối ưu 7
2.2.3 Hàng đợi ưu tiên: 8
2.2.4Xây dựng cây Huffman: 8
2.2.5Xây dựng bộ mã 8
2.2.6Nén file bằng mã Huffman 8
Hình 2.1: sơ đồ mã hóa các kí tự bằng mã Huffman 9
Bảng 2.1 Kết quả mã hóa các kí tự bằng mã Huffman 9
2.3Rice Coding 10
Trang 132.3.1Mã Golomb 10
Hình 2.2 Mã Golomb 11
2.3.2Mã Rice: 11
Bảng 2.2 Bảng mã hóa của q 12
Bảng 2.3 Bảng mã hóa r 12
2.3.3Ứng dụng: 13
2.4Sơ lược về bộ tổng hợp âm thanh của T-Engine 13
2.4.1Sơ đồ khối 13
Hình 2.3 Sơ đồ kết nối 13
Hình 2.4 Khối điều khiển tổng hợp âm thanh 14
2.4.2Các chân kết nối (Connector pins) 14
Hình 2.5 Sơ đồ chân của bộ tổng hợp âm thanh 14
Bảng 2.3 Chức năng các chân của jack CN9 15
Bảng 2.1 Chức năng các chân của jack CN10 15
2.4.3 Audio codec UDA1342TS 15
Hình 2.6: Sơ đồ khối UDA1342TS 17
2.5Giao tiếp I2C Hitachi 17
Hình 2.7: Sơ đồ kết nối giao tiếp I2C 18
Bảng 2.2 Mô tả chân I2C bus 18
2.5.1Module giao diện âm thanh nối tiếp 18
Hình 2.8: Sơ đồ khối SSI 19
2.5.2Các chân output/input 19
Bảng 2.3 Mô tả chân SSI bus 19
2.6Driver âm thanh 20
2.6.1Sơ đồ hoạt động 20
Hình 2.9: Hoạt động của driver âm thanh 20
2.6.2Cấu trúc dữ liệu 20
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() 22
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() 23
DN_AUDIO_MIXEROUTPUTVOL: Thuộc tính cho phép điều chỉnh và lấy dữ liệu của loa 23
CHƯƠNG 3: TỔNG QUAN VỀ FILE FLAC (FREE LOSSLESS AUDIO CODEC) 27
Trang 143.1Một vài chuẩn lossless 27
3.1.1APE (Monkey’s Audio) 27
3.1.2WV(WavPack) : 27
3.1.3FLAC (Free Lossless Audio Codec) 27
3.2Giới thiệu về file FLAC - Free Lossless Audio Codec 28
3.2.1Metadata 28
3.2.2Audio data 29
3.2.3Frame 29
3.3Quá trình mã hóa file FLAC 29
3.3.1Định nghĩa 29
3.3.2Blocking 30
3.3.3INTER CHANNEL DECORRELATION 31
3.3.4 Prediction 32
a.Verbatim 32
c.Fixed linear predictor 32
d.FIR linear prediction 33
3.3.5Residual Coding 33
3.4Cấu trúc file FLAC 34
Hình 3.1: Cấu trúc của file FLAC 35
Bảng 3.1: Các loại metadata block 35
Hình 3.2: Cấu trúc của Streaminfo metadata 36
Hình 3.3: Cấu trúc của Application metadata 36
Hình 3.4: Cấu trúc của Seektable metadata 37
Hình 3.5: Cấu trúc của Vorbis_comment metadata 37
Bảng 3.2: Bảng thông tin chứa trong Vorbis_comment metadata 37
Hình 3.6: Cấu trúc của Picture metadata 38
Bảng 3.3: Các loại dữ liệu trong Picture metadata 38
CHƯƠNG 4: XÂY DỰNG CHƯƠNG TRÌNH NGHE NHẠC 41
4.1Giải mã file FLAC 41
4.1.1 Đọc thông tin của file 41
4.1.2Đọc frame, giải mã file FLAC 41
Hình 4.1: Cấu trúc của frame 42
Bảng 4.1: Thông tin chi tiết của file từ frame header 42
Bảng 4.2: số bit trên một mẫu tương ứng trong trường “bit persample” 43
Bảng 4.3: Các loại subframe 43
Trang 15Hình 4.2 : Cấu trúc của Verbatim subframe 44
Hình 4.1 : Cấu trúc của Fixed subframe 44
Bảng 4.4 Công thức tính giá trị mẫu trong Fixed subframe 45
Bảng 4.5 Ví dụ đơn giản về cách tính mẫu 45
Hình 4.2: Cấu trúc của LPC subframe 46
Bảng 4.6 Ví dụ tính giá trị mẫu trong LPC subframe 46
4.1.3Residual coding 47
Hinh 4.5: Cấu trúc của Residual (phần dư) 47
4.1.4Mã Rice 48
Hình 4.63 Giải mã residual với tham số Rice là 16 49
Hình 4.4 Giải mã residual với tham số Rice là 4 49
Hình 4.5 Cách lưu dữ liệu với 2 kênh 50
Bảng 4.7 Tái tạo kênh 50
4.2Thiết kế chương trình nghe nhạc 50
4.2.1Phân tích vấn đề 50
4.2.2Hoạt động của chương trình 51
Hình 4.6: Đường đi dữ liệu của chương trình 51
4.2.3Hiện thực chương trình 54
Hình 4.70: Hoạt động của main task 55
Hình 4.81: Cấu trúc tổng quát của chương trình 56
a.Usb_task 57
Hình 4.91: Hoạt động của usb_task 57
CHƯƠNG 5:TỔNG KẾT 69
5.1Kết quả thực hiện 69
5.2Thuận lợi và khó khăn 69
5.2.1Thuận lợi: 69
5.2.2Khó khăn: 70
5.3Hướng phát triển 70
TÀI LIỆU THAM KHẢO 71
Trang 16CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI
1.1 Giới thiệu
Hiện nay, sự phát triển của công nghệ và mạng internet, nhu cầu chia sẻ thông tin
và dữ liệu ngày càng cao Âm nhạc và phim ảnh là một trong số những dữ liệu được quantâm chia sẻ nhiều nhất Đường truyền internet hiện nay mặc dù đã được cải thiện và pháttriển rất nhiều so với trước nhưng vẫn không thể đáp ứng được với khối lượng đồ sộ của
dữ liệu gốc Vấn đề đặt ra với các nhà nghiên cứu công nghệ là tạo được những dữ liệutương đương nhưng với một dung lượng vừa đủ để có thể chia sẻ qua mạng Nén dữ liệu
là giải pháp được sử dụng phổ biến Với nhiều thuật toán nén khác nhau, ta có thể tạo rađược nhiều loại nhạc nén với chất lượng và dung lượng đa dạng, tùy vào mục đích sửdụng
Trong một số trường hợp, với một số dạng âm thanh, sẽ rất khó để có thể phân biệtđược chất lượng giữa âm thanh gốc và các định dạng nén mất dữ liệu như MP3 Mặc dùthuật toán nén của MP3 đang dần được cải thiện, nhưng những gì mất đi khó mà lấy lạiđược, âm thanh lại càng khó Với một số loại nhạc sử dụng nhiều loại nhạc cụ hay nhạc
cổ điển thì tần số âm thanh có thể rất cao hoặc rất trầm, cắt xén quá nhiều dẫn đến suygiảm nghiêm trọng chất lượng của nó
Theo sự phát triển của công nghệ, nhu cầu con người cũng dần được nâng cao.Ngày xưa người ta dễ dàng chấp nhận một file nén định dạng mp3 có dung lượng gầnbằng 1/11 file âm thanh gốc, với một lượng lớn mẫu bị cắt xén Nhưng ngày nay với mộtdàn loa được đầu tư tốt, thì yêu cầu về chất lượng âm nhạc cũng được nâng lên Bài toánđặt ra là làm sao để có thể giữ được chất lượng của âm thanh gốc mà dung lượng của dữliệu vẫn có thể được giảm xuống Thế hệ của nhạc nén không mất dữ liệu ra đời nhằmthỏa mãn yêu cầu trên
Theo xu hướng trên, tương lai không xa, những yêu cầu về chất lượng âm thanhgốc trên các thiết bị di động, cầm tay sẽ là một trong những nhu cầu bức thiết, khi màphần cứng của chúng được cải thiện để đáp ứng yêu cầu của những người yêu nhạc khótính
Trang 17Do đó, nhóm em quyết định chọn đề tài xây dựng chương trình nghe nhạc địnhdạng file FLAC (Free Lossless Audio Codec) là một định dạng file nén không mất dữ liệu(lossless) trên T Engine board, nhằm giải quyết một phần nhỏ của vấn đề trên.
1.2 Ứng dụng
Chương trình sẽ đóng góp một phần vào các ứng dụng nghe nhạc hiện nay trên cácthiết bị di động như mp3, điện thoại di động, mp4 hay các thiết bị gia dụng nhằm làmphong phú thêm các loại định dạng có thể chơi được trên các thiết bị ấy, giải quyết đượcphần nào các yêu cầu nghe nhạc chất lượng cao của những người yêu nhạc khó tính
1.3 Các vấn đề của đề tài
Yêu cầu của đề tài là xây dựng được chương trình chơi file FLAC trên board Engine Vì thế vấn đề đầu tiên cần giải quyết chính là phải tìm hiểu về định dạng fileFLAC, sau đó tìm hiểu các giải thuật dùng để mã hóa file FLAC và hiện thực giải mãfile FLAC trên nền linux
T-Vấn đề tiếp theo là tìm hiểu driver âm thanh của board T Engine, xuất được fileFLAC ra cổng audio sao cho chất lượng âm thanh được đảm bảo là tốt nhất với những gìphần cứng hỗ trợ
Vấn đề cuối cùng là xây dựng giao diện đồ họa cho chương trình, giao diện đồ họaphải gồm các chức năng cơ bản của một trình nghe nhạc thông thường Ngoài file FLAC,chương trình còn hỗ trợ chơi một số file khác như MP3, WAV Chương trình có thể tìm
và chơi tất cả các file nhạc nằm trong PC card hay USB
1.4 Hướng giải quyết
1.4.1 Cấu trúc của file FLAC
Trước khi nghiên cứu về giải thuật giải mã file FLAC, cần phải nắm rõ cấu trúccủa file, để có thể dễ dàng định hướng được các bước giãi mã sau này Cấu trúc fileFLAC đã được giới thiệu khá chi tiết trong một số tài liệu trên mạng
Trang 181.4.2 Giải mã file FLAC
Tìm hiểu về một số giải thuật nén không mất dữ liệu như dự đoán tuyến tính
Huffman trước khi tìm hiểu và giải mã file FLAC
1.4.3 Driver âm thanh
Driver âm thanh trên T Engine đã được các nhóm trước đây nghiên cứu và xâydựng Vấn đề của nhóm chỉ là tìm hiểu quá trình hoạt động của driver, cách truyền dữ liệu
và cách sử dụng Tuy nhiên vì dung lượng của file FLAC là khá lớn nên vấn đề đặt ra làphải cải thiện driver để nâng cao tốc độ đọc và đồng bộ giữa quá trình đọc dữ liệu, quátrình giải mã và quá trình ghi vào driver sao cho hợp lí để chất lượng âm thanh đầu ra làtốt nhất
1.4.4 Xây dựng giao diện đồ hoạ
Phần giao diện của chương trình nghe nhạc sẽ gồm 2 phần chính là playlist để hiểnthị các file nhạc được tìm thấy trong USB hay trong PC Card và giao diện chương trìnhchơi gồm các nút điều khiển để điều khiển các trạng thái
Vì màn hình của T Engine board không lớn nên giao diện sẽ được cắt ra thành 2hình tương ứng với 2 phần trên
1.4.5 Bổ sung các loại file khác
Tìm hiểu thêm về thư viện của file MP3, tìm hiểu về đề tài chơi nhạc MP3 trên TEngine của các nhóm trước để bổ sung vào, làm cho chương trình phong phú hơn
Tìm hiểu về file WAV là một file âm thanh gốc, không nén và chơi file này bằngchương trình trên
1.5 Nội dung báo cáo
Báo cáo gồm 5 phần:
FLAC và driver âm thanh trên T Engine board
Trang 19 Chương 4: xây dựng chương trình chơi nhạc file FLAC trên T Engine board.
Trang 20CHƯƠNG 2: KIẾN THỨC NỀN TẢNG
2.1 Dự đoán tuyến tính LPC(Linear predictive coding)
Dự đoán tuyến tính là một bước không thể thiếu của hầu hết các giải thuật mã hóa
âm thanh không mất dữ liệu hiện đại ngày nay
Đây là phép toán xác định giá trị tương lai của một tín hiệu rời rạc theo thời gianbằng hàm tuyến tính của các tín hiệu trước đó
Trong xử lí tín hiệu số, dự đoán tuyến tính thường được gọi là mã hóa dự đoántuyến tính (LPC) và có thể xem là một phần của lí thuyết lọc
Trong phân tích hệ thống, dự đoán tuyến tính có thể được xem là một phần của môhình toán học hay tối ưu hóa
i=1 ai*x(n-1)
là hệ số dự đoán N là chỉ số về thời gian của tín hiệu, p là bậc của dự đoán tuyến tính hay
là bậc của LPC
Các lỗi hay còn gọi là sự sai biệt (residual) tạo ra bởi phương pháp này là
e(n)=x(n)-x'(n)
Với x(n) là tín hiệu gốc, x'(n) là tín hiệu dự đoán
Theo nguyên tắc, khi đã có thông tin về quá khứ thì việc dự đoán cho tương lai là
có cơ sở và dễ dàng hơn rất nhiều, do đó độ chính xác của dự đoán cũng cao Vì vậy, sựsai biệt hay còn gọi là lỗi (residual) e(n) được tạo ra bởi phương pháp này là khá nhỏ Sốbit cần dùng để lưu trữ residual vì vậy cũng nhỏ
Lúc đó, việc truyền dữ liệu cũng như lưu trữ dữ liệu gốc có thể là không cần thiếtnếu như có thể dự đoán được dữ liệu ấy Khi ấy, chỉ cần truyền hay lưu trữ sự sai biệt(residual), sau đó kết hợp giữa sự sai biệt (residual) với tín hiệu dự đoán để khôi phục lại
Trang 21tín hiệu gốc ban đầu Như vậy, sẽ giảm được một lượng lớn số bit cần dùng để lưu tínhiệu gốc mà vẫn đảm bảo được độ chính xác của tín hiệu gốc.
Phương trình trên có giá trị đối với tất cả các dự đoán tuyến tính Sự khác biệt
thống kê trung bình trên một tập các giọng nói được lựa chọn ngẫu nhiên
tuyến tính, hệ số này được ước lượng càng tốt thì độ chính xác trong dự đoán tuyến tính
Trong đó, bình phương trung bình lỗi dự đoán được tính bằng công thức:
Mã nhị phân tiền tố (prefix-free binary code) là bộ các từ mã của một tập hợp các
kí hiệu sao cho từ mã của mỗi ký hiệu không là tiền tố (phần đầu) của từ mã một ký hiệukhác trong bộ mã ấy
Ví dụ: Giả sử mã hóa từ "ARRAY", tập các ký hiệu cần mã hóa gồm 3 chữ cái
"A","R","Y"
một chữ cái chẳng hạn "A"=00, "R"=01, "Y"=10 Khi đó mã hóa của cả từ là
0001010010 Để giải mã ta đọc hai bit một và đối chiếu với bảng mã
vì từ mã của "A" là tiền tố của từ mã của "R" Để mã hóa cả từ ARRAY phải đặt
Trang 22dấu ngăn cách vào giữa các từ mã 0,01,01,0,11 Nếu mã hóa "A"=0, "R"=10,
"Y"=11 thì bộ mã này là mã tiền tố Với bộ mã tiền tố này khi mã hóa chuỗi
"ARRAY" ta có 01010011
2.2.1 Biểu diễn mã tiền tố trên cây nhị phân
Nếu có một cây nhị phân n lá ta có thể tạo một bộ mã tiền tố cho n ký hiệu bằng
cách đặt mỗi ký hiệu vào một lá Từ mã của mỗi kí hiệu được tạo ra khi đi từ gốc tới láchứa ký hiệu đó, nếu đi qua cạnh trái thì ta thêm số 0, đi qua cạnh phải thì thêm số 1 Câynhị phân mà bỏ qua các kí hiệu không sử dụng thì tạo thành cây có kích thước mã hóa lànhỏ nhất, gọi là cây Huffman
2.2.2 Xây dựng bộ mã tiền tố tối ưu
Cho tập A các ký hiệu và trọng số (tần suất) của chúng, Tìm một bộ mã tiền tố vớitổng độ dài mã hóa là nhỏ nhất
thấp nhất sẽ có độ ưu tiên cao nhất
đợi
Trang 23 Tạo một node mới từ 2 node trên với trọng số bằng tổng trọng số của 2node đó.
2.2.3 Hàng đợi ưu tiên:
Trong mỗi bước của thuật toán xây dựng cây Huffman, ta luôn phải chọn ra haigốc có trọng số nhỏ nhất Để làm việc này ta sắp xếp các gốc vào một hàng đợi ưu tiêntheo tiêu chuẩn trọng số nhỏ nhất Một trong các cấu trúc dữ liệu thuận lợi cho tiêu chuẩnnày là cấu trúc Heap (với phần tử có trọng số nhỏ nhất nằm trên đỉnh của Heap)
2.2.4 Xây dựng cây Huffman:
Ta sẽ lưu trữ cấu trúc của cây mã Huffman vào một mảng Cây Huffman gồm n lá
mỗi lá chứa chỉ số của kí hiệu tương ứng Mỗi lần ghép 2 cây thành một ta phải thêm một
đỉnh, như vậy cây biểu diễn mã Huffman gồm 2.n-1 đỉnh Ta kí hiệu cây này là
Huff[1 2n-1] Vì mỗi gốc mới bổ sung đều có trọng số nên ta mở rộng mảng W[1 n] các
trọng số thành mảng W' [1 2n+1] Gọi m là số đỉnh của cây sẽ xây dựng, lúc đầu ta có n
lá, đỉnh bổ sung lần đầu sẽ là n+1, lần thứ 2 là n+2, Khi lấy ra hai kí hiệu có tần số nhỏnhất chẳng hạn kí hiệu thứ i làm con trái và kí hiệu thứ j làm con phải của đỉnh mới bổ
sung có chỉ số m ta đặt Huff[i]=-m, Huff[j]=m.
2.2.5 Xây dựng bộ mã
Sau khi cấu trúc của cây Huffman được lưu vào mảng Huff ta dễ dàng xây dựngmảng Code[1 n] cho bộ mã nhị phân tiền tố tối ưu của các kí tự A[1 n]
2.2.6 Nén file bằng mã Huffman
Trang 245. Nếu đã hết file cần nén thì dừng
Ví dụ xây dựng bộ mã hóa cho các kí tự sau:
Hình 2.1: sơ đồ mã hóa các kí tự bằng mã Huffman
Kết quả:
Bảng 2.1 Kết quả mã hóa các kí tự bằng mã Huffman
Trang 25số cao hơn các giá trị lớn.
Là một mã có độ dài không cố định, gần giống mã Huffman nhưng nó không dựatrên dữ liệu mà dựa trên mô hình đơn giản của tần suất xuất hiện của các giá trị
Mối quan hệ giữa kích thước và tần suất xuất hiện nằm trong một tham số gọi là sốchia M
Mã Golomb sử dụng tham số M để chia input N làm 2 phần : q là kết quả của phépchia (thương) và r là số dư của phép chia
q = N/M
r = N-q*M
Thương được ghi trong kí hiệu đơn nguyên (unary notation) và số dư ghi trong kíhiệu nhị phân (binary notation) Khi M=1, mã Golomb được xem là tương đương với mãunary (mã đơn nguyên)
Mã Golomb được xem như một mã xác định một số N bằng cách chỉ ra vị trí(position) q và offset r sử dụng tham số M làm số chia
Trang 26Hình 2.2 Mã Golomb
2.3.2 Mã Rice:
Là một trường hợp đặc biệt của mã Golomb, để tạo ra một mã tiền tố đơn giản (cóthể không phải là mã tiền tố tối ưu) Trong khi mã Golomb có tham số M là một số dươngbất kì thì mã Rice lại đòi hỏi tham số M phải là một lũy thừa của 2 Vì vậy, Mã Ricethuận lợi khi sử dụng trên máy tính vì nhân và chia 2 được hiện thực dễ dàng trong số họcnhị phân
Rice coding được sử dụng như là một giai đoạn trong quá trình nén không mất dữliệu trong nén hình ảnh và âm thanh
Giải thuật :
1. Khai báo M là một giá trị kiểu int và cố định.
2. Với N là số cần mã hóa, tìm thương và số dư.
i Viết một chuỗi gồm q bit 1
ii Viết 1 bit 0 sau chuỗi trên
c Tìm mã của r
i Nếu M là lũy thừa của 2, mã của r chính là số nhị phân của chính nó, số bit cần để lưu mã r là log2(M) (Đây là mã Rice).
ii Ngược lại, nếu M không phải lũy thừa của 2 ,b= [log2(M)]
1 Nếu r < 2b − M , mã r cần b-1 bit để lưu
2 Nếu r > 2b − M, mã r cần b bit để lưu
Trang 28có xu hướng xuất hiện nhiều hơn so với các lỗi lớn, thích hợp cho việc mã hóa Rice.
Trong các codec âm thanh nén không mất dữ liệu như FLAC, shorten, apple, Ricecoding được sử dụng như một bước của quá trình dự đoán tuyến tính
Rice coding cũng được sử dụng trong nén hình ảnh không mất dữ liệu
2.4 Sơ lược về bộ tổng hợp âm thanh của T-Engine
2.4.1 Sơ đồ khối
Hình 2.3 Sơ đồ kết nối
Bộ tổng hợp âm thanh của T-Engine bao gồm một giao diện âm thanh nối tiếp(SSI) của SH7760 và một bộ codec âm thanh (UDA1342TS của Philips) để âm thanh có
Trang 29thề được xuất ra headphone kết nối với một output mini-jack (CN9) hoặc đưa vàoearnphone được kết nối với mini-jack (CN10).
Hình 2.4 Khối điều khiển tổng hợp âm thanh
2.4.2 Các chân kết nối (Connector pins)
Hình 2.5 Sơ đồ chân của bộ tổng hợp âm thanh
Trang 30Bảng 2.3 Chức năng các chân của jack CN9
• Mô tả tổng quát
UDA1342TS là 1 single-chip, có ADC (Analog-to-Digital Converter) 4 kênh vàDAC (Digital-to-Analog Converter) 2 kênh với đặc trưng là sử dụng kĩ thuật đảo chuỗi bit
Trang 31(bitstream conversion technique) Tiêu thụ điện ít và mức điện áp yêu cầu thấp nên rất Engine/SH7760 phù hợp với những thiết bị âm thanh số, khả chuyển, ít dùng điện, điện
T-áp thấp, có hỗ trợ chức năng thu và phát lại
UDA1342TS hỗ trợ các định dạng dữ liệu: I2C-bus, MSB-justified với độ dài từtới 24 bits và dạng dữ liệu tuần tự LSB-justified với độ dài từ 16, 20 và 24 bits
Nó cũng hỗ trợ phối hợp định dạng MSB-justified ở đầu ra và định dạng LSB-justified ởđầu vào
UDA1342TS cũng có thể xử lý âm thanh trong chế độ phát lại (đã được điềukhiển bởi microcontroller) như de-emphasis, volume, mute, tăng bass và treble bằng giaodiện L3-bus hoặc I2C -bus
Sơ đồ khối
Trang 32Hình 2.6: Sơ đồ khối UDA1342TS
2.5 Giao tiếp I2C Hitachi
Các đặc điểm:
Hổ trợ giao tiếp với bus I2C của Philips
7 bit địa chỉ slave
Chế độ nhanh tương thích
Có thể tương thích với nhiều loại tần số clock hệ thống
Hổ trợ chế độ buffer FIFO 16 phần
Trang 33Sơ đồ khối:
Hình 2.7: Sơ đồ kết nối giao tiếp I2C
Các chân output/input:
Bảng 2.2 Mô tả chân I2C bus
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ợptheo 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:
Số lượng kênh: hai kênh (số lượng tối đa)
Trang 34 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 bitliê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ânchia 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ạngbus 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
Trang 351
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
Dữ liệu thuộc tính:
Trang 36DN_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;
Ta xem xét các thuộc tính sau:
Trang 37 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:
Đị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íchthước của buffer driver với 2 hàm tk_rea_dev() và tk_swri_dev()
Trang 38 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]
} MixerLineVolume;
lineId:
DN_AUDIO_DRV_MBF: Thuộc tính cho phép tạo, xóa message buffercủa driver với hàm tk_rea_dev() và tk_swri_dev() Message buffer này có nhiệm vụ thôngbá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
Trang 39// Thông báo rằng driver đã chơi hết dữ liệu trong buffer
#define MSG_DRV_STOP_BUFFER -3
// Thống báo người dùng đã stop
Trang 40CHƯƠNG 3: TỔNG QUAN VỀ FILE FLAC (FREE
LOSSLESS AUDIO CODEC)
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ượngkhoả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ếtcá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ộtfile 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)
Đuôi mở rộng là flac