Đề tài Xây dựng chương trình xử lý âm thanh số

Tài liệu Đề tài Xây dựng chương trình xử lý âm thanh số: Giới thiệu chung 1. Giới thiệu chung Cùng với sự phát triển của cuộc cách mạng khoa học và công nghệ đang diễn ra một cách sôi động, chúng ta đang tiến dần tới thế giới của sự số hoá. Với các ưu điểm của xử lý số, nhanh gọn, chính xác với chất lượng cao, mọi lĩnh vực hoạt động của xã hội loài người, nhất là các ngành trong các lĩnh vực thông tin liên lạc, phát thanh truyền hình ... đều tiến tới việc áp dụng một cách đồng bộ và có hiệu quả các công cụ cũng như các phép xử lý số. Trong đó, âm thanh là một lĩnh vực đặc biệt quan trọng, đây là một phương thức dùng để trao đổi cũng như cảm nhận tin, không chỉ là tiếng nói, bản nhạc mà đó là tất cả các âm mà ta cảm nhận được trong cuộc sống hàng ngày, do đó, lĩnh vực về âm thanh không thể nằm ngoài xu hướng phát triển chung mà còn cần sự nghiên cứu sâu hơn nữa. 2. Đặt vấn đề Với âm thanh số, bằng việc lưu trữ âm thanh dưới dạng các dãy số, chúng ta đạt được yêu cầu về tốc độ truyền cũng như về khối lượng lưu trữ và độ trung thực trong cá...

doc90 trang | Chia sẻ: hunglv | Lượt xem: 1330 | Lượt tải: 5download
Bạn đang xem trước 20 trang mẫu tài liệu Đề tài Xây dựng chương trình xử lý âm thanh số, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Giới thiệu chung 1. Giới thiệu chung Cùng với sự phát triển của cuộc cách mạng khoa học và công nghệ đang diễn ra một cách sôi động, chúng ta đang tiến dần tới thế giới của sự số hoá. Với các ưu điểm của xử lý số, nhanh gọn, chính xác với chất lượng cao, mọi lĩnh vực hoạt động của xã hội loài người, nhất là các ngành trong các lĩnh vực thông tin liên lạc, phát thanh truyền hình ... đều tiến tới việc áp dụng một cách đồng bộ và có hiệu quả các công cụ cũng như các phép xử lý số. Trong đó, âm thanh là một lĩnh vực đặc biệt quan trọng, đây là một phương thức dùng để trao đổi cũng như cảm nhận tin, không chỉ là tiếng nói, bản nhạc mà đó là tất cả các âm mà ta cảm nhận được trong cuộc sống hàng ngày, do đó, lĩnh vực về âm thanh không thể nằm ngoài xu hướng phát triển chung mà còn cần sự nghiên cứu sâu hơn nữa. 2. Đặt vấn đề Với âm thanh số, bằng việc lưu trữ âm thanh dưới dạng các dãy số, chúng ta đạt được yêu cầu về tốc độ truyền cũng như về khối lượng lưu trữ và độ trung thực trong các phép xử lý như khử nhiễu, soạn thảo hay các hiệu quả tạo độ vang, trễ ... Do vậy, ngoài các phương tiện sử dụng kỹ thuật số, như camera số, thiết bị ghi số, điện thoại số... với chất lượng cao, thì những âm thanh tương tự được ghi từ micro với các nhạc cụ truyền thống đều được chuyển đổi sang dạng số hoá. Hơn nữa, với âm thanh, chúng ta không chỉ quan tâm tới khả năng cảm nhận một cách trung thực nhất âm thanh tự nhiên, mà ta còn hướng tới việc tạo ra (hay tổng hợp) được những âm thanh mà ta mong muốn. Do đó, khi nói đến âm thanh số thì cần thiết phải xét tới 3 khía cạnh: Các khuôn dạng lưu trữ âm thanh với các đặc tính riêng biệt. Đây là yêu cầu trước tiên của bất kỳ quá trình thu thanh hay khi cần đọc dữ liệu để phân tích. Cần phải hiểu rõ các đặc tính cả từng khuôn dạng thì mới có thể lưu trữ một cách hiệu quả nhất. Thao tác với các tệp âm thanh qua một trình soạn thảo âm thanh với các phép sao chép, cắt, dán, lọc, trộn âm hay chuyển đổi khuôn dạng tệp lưu trữ cũng như phương thức lưu trữ dữ liệu. Đây là cách để chúng ta có thể cảm nhận được âm thanh một cách rõ nét. Phân tích tín hiệu của âm thanh bằng cách biểu diễn dữ liệu âm thanh dưới dạng tín hiệu tuỳ theo mục đích phân tích. Dữ liệu đọc từ tệp, sau đó qua các phép xử lý tín hiệu số như lọc, hàm cửa sổ, biến đổi FFT, Cepstrum ... để có thể rút ra các tham số đặc trưng, các thông tin cần thiết cho các quá trình nhận dạng hay tổng hợp âm sau đó. 3. Chủ đề của luận án Chính vì vậy, với đề tài “Xây dựng chương trình xử lý âm thanh số” thì nhiệm vụ trước tiên sẽ phải nghiên cứu, tìm hiểu các khuôn dạng lưu trữ dữ liệu, sau đó xây dựng một chương trình (xử dụng ngôn ngữ lập trình Delphi) để thao tác với các tệp âm thanh và phân tích tín hiệu của các âm thanh đó. Chương 1 lý thuyết xử lý tín hiệu số 1. Tín hiệu số Tín hiệu là biểu hiện vật lý của thông tin. Về mặt toán học, tín hiệu được coi là một hàm của một hay vài biến độc lập. Để phân loại tín hiệu, ta có thể xét đến tính chất của biến độc lập thời gian hay phân loại theo biên độ tín hiệu (liên tục hay rời rạc). Từ đó ta có định nghĩa: Tín hiệu số (Digital Signal) là tín hiệu rời rạc (theo biến độc lập thời gian) đồng thời có biên độ cũng rời rạc hoá (lượng tử hoá). Hình 2.1: Tín hiệu số Theo định nghĩa trên, tín hiệu có vai trò là vật mang thông tin. Nên tín hiệu cần phải được xử lý sao cho có thể dễ dàng rút ra các thông tin mong muốn hay lưu trữ thông tin một cách tối ưu. Cho nên việc phát triển các kỹ thuật cũng như các hệ thống xử lý tín hiệu đóng vai trò hết sức quan trọng. Thông thường các phép xử lý tín hiệu là các phép biến đổi tín hiệu thành dạng khác mong muốn, tuỳ theo yêu cầu thu nhận thông tin từ tín hiệu đó. Ví dụ như việc lọc bỏ nhiễu ra khỏi tín hiệu có ích, hay xác định thông số mang tin nào đó. 2. Xử lý tín hiệu số (DSP - Digital Signal Processing) Xử lý tín hiệu được sử dụng trong rất nhiều lĩnh vực khoa học khác nhau, và xử lý âm thanh là một trong số đó. Trong quá trình xử lý, các phép xử lý DSP chuẩn cơ bản là: FFT, lọc, thiết kế các bộ lọc thời gian, decimation, interpolation (nội suy), tích chập (convolution), ... Các chức năng DSP (Digital Signal Processing) được thực hiện bởi soundcard tương đương với một tập các khả năng của phần cứng tổng hợp âm nhạc điện tử analog: trộn, lọc, điều chế tần số, biên độ... và nén. Tất cả các hiệu quả được tạo ra bằng cách dùng bộ trễ tín hiệu như: vang, lặp.... đều có thể sử lý bằng DSP. Sự khác nhau là DSP (cả phần cứng và phần mềm) có thể thực hiện các chức năng trên dạng sóng số hóa. Nhiều soundcard có tích hợp DSP để tăng tốc độ xử lý. Việc phân tích và thiết kế của các hệ thống tuyến tính đã được thực sự đơn giản hoá bởi các phép biểu diễn trong miền tần số của cả tín hiệu và hệ thống. Trong đó biến đổi Fourier và biến đổi Z đóng vai trò quan trọng trong việc biểu diễn các tín hiệu và hệ thống rời rạc theo thời gian. 2.1. Phép biến đổi Z Nói chung, phép biến đổi Fourier là một công cụ mạnh để nghiên cứu tín hiệu số và tương tự về cả mặt lý thuyết và thực hành. Nhưng đối với tín hiệu rời rạc, phép biến đổi Z được sử dụng rộng rãi hơn bởi đây là phép biến đổi mạnh về phương diện lý thuyết. Định nghĩa Phép biến đổi z của tín hiệu x(n) là: X(z) = x(n).z-n (1.1) Trong đó X(z) là hàm biến phức của biến phức z. Chuỗi X(z) còn được gọi là chuỗi Laurent. X(z) và các đạo hàm của nó đều là liên tục trong miền hội tụ. Đây là phép biến đổi z hai bên (n chạy từ -Ơ tới Ơ), được dùng để nghiên cứu hệ thống xác lập của hệ thống. Với tín hiệu nhân quả, ta dùng phép biến đổi z một phía: X(z) = (1.2) Phép biến đổi z một phía dùng để nghiên cứu chế độ quá độ của hệ thống. Phép biến đổi z ngược Về mặt lý thuyết, phép biến đổi z ngược có thể thiết lập sau khi dùng định lý Côsi (Cauchy) về tích phân trên đường cong khép kín trên mặt phẳng phức: I = (1.3) trong đó G là đường cong khép kín bao quanh gốc toạ độ trên mặt phẳng z. Kết quả là: I = Bằng cách nhân hai vế của biến đổi z với zl-1/2pj, lấy tích phân quanh gốc toạ độ và nằm trong vùng hội tụ, và sau đó can thiệp tích phân và tổng, ta có biểu thức biến đổi z ngược như sau: x(l) = (1.4) Biểu thức thoả mãn với mọi l, đường cong G là đường cong khép kín, nằm trong miền hội tụ và chạy theo chiều dương (ngược chiều kim đồng hồ). Phép biến đổi z được áp dụng trong quá trình giải các phương trình sai phân tuyến tính hệ số hằng. Và các tính chất của biến đổi z tạo nhiều thuận lợi trong các vấn đề xử lý tín hiệu số. Như tính tuyến tính cho ta cách tính biến đổi z ngược thông qua việc phân tích một hàm phức tạp thành các hàm đơn giản. Quan hệ của phép biến đổi Z với phép biến đổi Fourier Từ công thức định nghĩa phép biến đổi z (1.1), thay z=ejq, tức là biểu diễn trong toạ độ cực, và với q = 2pf. X(z) = x(n).r-n.e-j2pfn Qua công thức trên, ta thấy phép biến đổi z là phép biến đổi Fourier của tích tín hiệu này với một tín hiệu hàm số mũ r-n. Hơn nữa, phép biến đổi Fourier của tín hiệu rời rạc là phép biến đổi z tính trên đường tròn đơn vị (|z| = 1 hay r = 1), với điều kiện miền hội tụ của phép biến đổi z phải chứa đường tròn đơn vị. Hay nói cách khác, trên đường tròn đơn vị phép biến đổi z và Fourier là đồng nhất. X(f) = X(z) = x(n).e-2jpfn với |z| = 1 (1.5) So với phép biến đổi Laplace Xét tín hiệu tương tự Xa(t), phép biến đổi Laplace của tín hiệu này là: Xa(t) = xa(t).e-stdt Nếu tín hiệu Xa(t) được lấy mẫu đều với chu kỳ Ts và d(t) là hàm xung Dirac, thì phép biến đổi Laplace của tín hiệu lấy mẫu là: Xe(s) = xa(t).s(t-n.Ts).e-stdt Xe(s) = (1.6) So sánh biểu thức này với biến đổi z của tín hiệu x(n) = xa(nTs), ta thấy biến đổi Laplace của tín hiệu lấy mẫu là biến đổi z của tín hiệu số tương ứng và được tính với z = exp(s.Ts). Có nghĩa là: X(z) = Xe(s) với z = . 2.2. Biến đổi Fourier rời rạc (DFT - Discrete Fourier Transform) DFT được sử dụng rộng rãi trong quá trình tính toán sự đánh giá phổ, các hàm tự tương quan và việc cài đặt các bộ lọc số. Đây là phép biến đổi Fourier rời rạc của tín hiệu x(n) có độ dài hữu hạn và có trục tần số cũng được rời rạc hoá. Trong đó, tín hiệu x(n) có độ dài hữu hạn là tín hiệu có giá trị khác 0 trong một khoảng hữu hạn thời gian nào đó và chúng bằng 0 trong khoảng còn lại. Với x(n) được dùng như là một chu trình của tín hiệu, ta có thể xây dựng tín hiệu xp(n) tuần hoàn với chu kỳ N bằng cách xếp chồng tuần hoàn x(n): Xp(n) = (1.7) Khi xếp chồng tuần hoàn, nếu M Ê N (với M = N2 - N1 +1, trong đó N1 và N2 là thời điểm mà trong đó tín hiệu tồn tại), thì hiện tượng trùm thời gian giữa các phần của xp(n) sẽ không xảy ra, nghĩa là có thể dễ dàng lấy ra x(n) ban đầu. Lúc này tín hiệu x(n) có độ dài là N với các mẫu từ M tới N-1 có giá trị bằng 0. Và ta quy ước: xp(n) = x((n))N. Ta có các công thức biến đổi Fourier như sau: X(k) = (1.8) x(n) = (1.9) Trong đó X(k) là một chu kỳ của Xp(k), với Xp(k) là các mẫu trên đường tròn đơn vị của biến đổi z một chu kỳ của xp(n), hay biến đổi Fourier X(f) của một chu kỳ của xp(n). 2.3. Lọc tín hiệu Các bộ lọc được sử dụng để thay đổi giá trị tần số của âm thanh. Đây là khâu xử lý cơ bản cho một chuỗi các bước xử lý âm thanh tiếp theo. Ví dụ như, quá trình lọc có thể là gỡ bỏ nhiễu ra khỏi quá trình thu thanh hay tách biệt một âm, giọng nào đó bằng cách chỉ cho các tần số xác định nào đó đi qua. Chính vì vậy, lọc số là một ứng dụng quan trọng nhất của xử lý tín hiệu. Các bộ lọc số đã dần dần thay thế các bộ lọc tương tự. Việc thiết kế các bộ lọc số thực tế đều đi từ lý thuyết các bộ lọc số lý tưởng. Các bộ lọc số tiêu biểu là: Bộ lọc số thông thấp (Low pass filter) Bộ lọc số thông cao (High pass filter) Bộ lọc số thông dải (Band pass filter) Bộ lọc số chắn dải (Band stop filter) Trong đó, các bộ lọc được sử dụng để lọc tần số chính, nên tất cả các đặc trưng của lọc tần số đều được cho theo đáp ứng biên độ. 2.4. Hàm cửa sổ Như ta đã biết, phép biến đổi Fourier rời rạc DFT tác động trên tín hiệu có độ dài hữu hạn, nên cần thiết phải hạn chế độ dài đối với các tín hiệu có độ dài vô cùng hoặc quá lớn để có thể nghiên cứu phổ của chúng. Để làm điều này ta thường dùng hàm cửa sổ, tức là nhân tín hiệu x(n) với cửa sổ w(n-n0) để nhận được một đoạn xN(n) trong khoảng n0 tới n0+N-1 để phân tích. xN(n) = x(n). w(n- n0) = (1.10) Việc nhân tín hiệu với hàm cửa sổ theo thời gian tương đương với việc nhân chập phổ của tín hiệu x(n) với phổ của cửa sổ: XN(f) = X(g)W(f-g)dg = X(f)*W(f) (1.11) Trong đó XN(f), X(f), và W(f) là biến đổi Fourier tương ứng của xN(n), x(n), và w(n). Kết quả nhận được từ tín hiệu sau khi đã cho qua cửa sổ không những phụ thuộc vào dạng cửa sổ mà còn phụ thuộc vào số điểm tín hiệu phân tích N, cũng như vị trí cửa sổ được đặt ở đâu, tức là tìm n0 phù hợp. Ta phải chọn vị trí cửa sổ sao cho cửa sổ bao trùm lên phần quan trọng của tín hiệu và bỏ qua những chỗ có biên độ nhỏ, và phải chọn N sao cho một chu kỳ xp(n) là xấp xỉ của x(n) với sai số cho phép và không để xảy ra hiện tượng trùm thời gian. Như vậy, với những tín hiệu bất kỳ, do không có đủ thông tin để có thể chọn n0 và N một cách hợp lý thì sẽ không thể nhận được một kết quả phân tích tối ưu. Khi đó tốt nhất ta nên xem xét ở khía cạnh tần số để xác định N. 2.5. Phép biến đổi nhanh Fourier (FFT - Fast Fourier Transform) Đây thực chất là DFT nhưng với một thuật toán nhanh, gọn và hiệu quả. FFT đã tạo ra một bước ngoặt mới và thực sự đóng vai trò hết sức quan trọng trong việc phân tích, thiết kế và thực hiện các thuật toán xử lý tín hiệu số cũng như tín hiệu tương tự. Tuy có nhiều thuật toán tính FFT khác nhau, nhưng nguyên tắc chung của tất cả các thuật toán này là dựa trên việc phân tích cách tính DFT cuả một dãy N số (gọi tắt là DFT N điểm) thành các phép tính DFT của các dãy nhỏ hơn, trong đó số phép tính tỷ lệ với N.log(N). Trong các cách tính này, FFT có 2 lớp cơ bản: thuật toán FFT được phân chia theo thời gian và phân chia theo tần số. Cả hai thuật toán đều sử dụng phép tính toán tại chỗ (in place), và số phép nhân phức trong cả hai thuật giải là như nhau. Sự khác nhau cơ bản giữa hai cách tính là thứ tự xắp xếp dữ liệu đầu vào và đầu ra. Thông thường, ta xét tới 2 cách tính FFT: tính FFT thuận và FFT ngược. Bắt đầu từ cặp công thức biến đổi Fourier rời rạc thuận và ngược: X(k) = x(n).WNkn với k = 0, 1, .., N-1 x(n) = X(k).WN-kn với n = 0, 1, .., N-1 Cặp công thức trên là tương tự nhau, chỉ khác ở hệ số tỷ lệ và dấu của mũ của hệ số W. Như vậy, ta có thể dùng công thức tính FFT thuận để tính FFT ngược bằng cách lấy liên hợp phức của cả hai vế công thức * và chuyển hệ số tỷ lệ N sang trái: N.x*(n) = X*(k).WknN (1.12) Vế phải chính là DFT của dẫy X*(k) nên có thể tính được bằng bất kỳ chương trình tính FFT nào. Còn dãy x(n) có thể tính bằng cách lấy liên hợp phức hai vế công thức * và chia cho n: x(n) = (1.13) Tóm lại, để tính FFT ngược từ chương trình tính FFT thuận ta thực hiện các bước sau: Lấy liên hợp phức của X(k) bằng cách đổi dấu phần ảo của X(k). Tính FFT của dãy X(k) đã đổi dấu. Đổi dấu phần ảo của kết quả thu được, sau đó chia dãy cho hệ số tỷ lệ N để có kết quả cuối cùng. 2.6. Cepstrum Phép biến đổi tín hiệu sang dạng Cepstrum tương ứng là một phép biến đổi homomorphic, phép giải các bài toán không tuyến tính bằng các công cụ toán tuyến tính đã biết. Cepstrum là từ đảo của từ Spectrum (phổ) có nghĩa là chúng ta đang tiếp tục thực hiện việc phân tích phổ nào đó trên một phổ tần số. Khái niệm về Cepstrum là một phần cơ bản của lý thuyết trong các hệ thống homomorphic cho quá trình xử lý tín hiệu. Ngoài ra, ta có khái niệm: Cepstrum phức có nghĩa là biến đổi ngược Fourier (hay Z) của logarit tự nhiên phức của phổ phức; và Cepstrum thực là phép biến đổi của Fourier ngược của logarit thực của biến đổi Fourier của hàm đó. Hình 2.2: Hệ thống xử lý Homomorphic Ưu điểm của hệ thống xử lý này là thuật toán có thể được tách thành các thuật toán mắc dây chuyền như trên. Trong đó, các khối A và A-1 là các khối nghịch đảo của nhau. Còn khối F là hệ thống tuyến tính, bất biến, hay nói chung đó là một bộ lọc tuyến tính đơn giản. Chương 2 giới thiệu chung về âm thanh số 1. Âm thanh và đặc tính của âm thanh 1.1. Sóng âm và cảm giác âm Khi một vật dao động về một phía nào đó, nó làm cho các lớp không khí liền trước bị nén lại, và lớp không liền sau dãn ra. Sự nén và dãn không khí như vậy lặp đi lặp lại một cách tuần hoàn nên đã tạo ra trong không khí một sóng đàn hồi. Sóng này truyền tới tai, nén vào màng nhĩ khiến cho màng nhĩ cũng dao động với cùng tần số. Khi màng nhĩ dao động, các vị trí phân biệt của màng nhĩ trên bề mặt giống như nó chuyển động về trước hay sau đáp ứng với các sóng âm vào. Khi cùng một thời điểm, ta nghe thấy nhiều âm, thì mọi âm thanh phân biệt này được trộn với nhau một cách tự nhiên trong tai giống như một hình mẫu đơn của áp suất không khí thay đổi. Tai và óc làm việc cùng nhau để phân tích tín hiệu này ngược lại thành những cảm giác về âm riêng biệt. 1.2. Độ cao của âm Độ cao của âm là một đặc tính sinh lý của âm và nó phụ thuộc vào một đặc tính của âm là tần số. Những âm có tần số khác nhau, tạo nên cảm giác về các âm khác nhau: âm có tần số lớn gọi là âm cao hay âm thanh; âm có tần số nhỏ gọi là âm thấp hay âm trầm. Sự cảm nhận về mức độ to nhỏ của âm thanh được gọi là cường độ (pitch). Và cường độ có liên quan rất gần với một thuộc tính về mặt vật lý gọi là tần số (frequency). 1.3. Âm lượng của âm (độ to của âm) Năng lượng của âm Giống như các sóng cơ học, sóng âm cũng mang năng lượng sóng tỷ lệ với bình phương biên độ sóng. Và cường độ âm chính là năng lượng được sóng âm truyền trong một đơn vị thời gian qua một đơn vị diện tích đặt vuông góc với phương truyền (đơn vị W/m2). Tuy nhiên, để cảm nhận một âm, ta không đánh giá qua giá trị tuyệt đối của cường độ âm I, mà xét theo mức cường độ âm L. Tức là: L(B) = lg(I/I0) , với I0 là một giá trị chuẩn nào đó. Thông thường, L lấy đơn vị là deciben (ký hiệu là dB). Với L=1dB (I lớn gấp 1,26 lần I0) là mức cường độ nhỏ nhất mà tai ta có thể phân biệt được. Âm lượng của âm Để có thể tạo ra cảm giác âm, cường độ âm phải lớn hơn một ngưỡng nào đó. Với các tần số trong khoảng 1000-5000Hz, ngưỡng nghe khoảng 10-12W/m2. Với tần số 50Hz thì ngưỡng nghe lớn gấp 105 lần. Và mức âm lượng của âm phụ thuộc vào cả cường độ âm và tần số. 1.4. Âm sắc của âm Âm sắc là một đặc tính sinh lý của âm và nó được cấu thành trên cơ sở các đặc tính vật lý của âm là tần số và biên độ. Đây là một đặc trưng riêng của từng nguồn phát âm. Khi một nguồn phát ra một âm có tần số f1, thì đồng thời cũng phát ra các âm có tần số f2=2* f1, f3=3* f1 ... Âm có tần số f1 gọi là âm cơ bản hay hoạ âm thứ nhất. Các âm có tần số f2, f3, ... gọi là các hoạ âm thứ hai, thứ ba ... Tuỳ theo đặc tính của từng nguồn phát âm mà tạo ra các hoạ âm khác nhau với biên độ hay khoảng kéo dài khác nhau. Do đó âm do một nguồn âm phát ra là sự tổng hợp âm cơ bản và các hoạ âm. Nên, mặc dù có cùng tần số f1 của âm cơ bản nhưng đường biểu diễn không còn là một đường hình sin đơn thuần mà là một đường phức tạp có chu kỳ. 2. Âm thanh số Dạng chung nhất của các quá trình thu âm thanh số là dạng điều biến mã xung (PCM - Pulse Code Modulation). Đây là dạng mà phần lớn các đĩa compact và các tệp Wave sử dụng. Trong phần cứng thu thanh dạng PCM, một microphone chuyển dạng biến đổi áp suất không khí (các sóng âm thanh) thành dạng biến đổi điện áp. Sau đó một bộ chuyển đổi tương tự-số đo (mẫu hoá) dòng điện áp tại các quãng thời gian đều nhau. Ví dụ như, trong một đĩa compact có tới 44,100 mẫu được lấy mỗi giây. Mỗi điện áp mẫu hoá nhận được sẽ được chuyển đổi sang dạng số nguyên 16-bit. Một đĩa CD chứa 2 kênh dữ liệu: một cho tai trái, và một cho tai phải (đối với âm thanh dạng stereo). Hai kênh được thu thanh độc lập, được đặt theo cạnh (side) trên đĩa compact (dữ liệu cho các kênh trái và phải luân phiên nhau...trái, phải, trái, phải, ...). Dữ liệu nhận được từ quá trình thu thanh PCM là một hàm theo thời gian. 2.1. Nguyên lý Về cơ bản, âm thanh tương tự và số là khác nhau, nên ta luôn bị mất thông tin khi làm phép chuyển đổi giữa chúng. Khi được số hoá, sóng âm thanh được biểu diễn như là một chuỗi các số (được gọi là các mẫu), mà chúng biểu diễn áp suất không khí hay tín hiệu điện tại các thời điểm kế tiếp nhau theo thời gian. Khi mẫu hoá một tín hiệu tương tự, ta luôn gặp phải 2 vấn đề: thứ nhất, mỗi giá trị kế tiếp trong dạng biểu diễn dạng số là một quãng xác định nào đó của thời gian, và mỗi khối có một độ rộng xác định; thứ hai là các số số hoá là rời rạc. Chỉ có một số xác định các độ cao có thể cho mỗi khối. Theo hình vẽ, ta thấy độ cao các khối không ăn khớp với đường tín hiệu gốc. Hình 2.3: Chuyển đổi tín hiệu sang dạng các mẫu số Đây là hai lỗi cơ bản trong tín hiệu âm thanh số. Lỗi này có thể được kiểm soát bằng cách thay đổi khuôn dạng chi tiết của dạng biểu diễn âm thanh, nhưng không thể loại bỏ được hoàn toàn. Chính vì vậy, tuỳ theo ứng dụng ta sẽ phải chấp nhận một số lỗi nhất định. Và các hệ số khác như kích thước dữ liệu hay tần số xử lý yêu cầu ta phải chấp nhận một sai số lớn hơn từ một số nguồn để có thể giảm hơn nữa các sai số khác. 2.2. Tần số và cường độ Tần số của một sóng hình sin là khoảng thời gian mà nó dùng cho một chu kỳ hoàn chỉnh. Tần số được tính theo hertz (Hz), là số các chu kỳ hoàn chỉnh mà chúng xuất hiện trong một giây. Tai người có thể nghe thấy các sóng hình sin có tần số dao động trong khoảng 30 Hz tới 20.000 Hz. Những dao động trong miền tần số này gọi là dao động âm hay âm thanh. Chu kỳ (periodic) là nghịch đảo của tần số, là khoảng thời gian mà tín hiệu lặp lại một cách chính xác. Mặc dù rất nhiều hàm toán học được sử dụng để làm việc với âm thanh dựa trên các tín hiệu lặp một cách lý tưởng, đặc biệt là phép biến đổi Fourier, nhưng lại có rất ít các âm thanh thực là thực sự tuần hoàn. Trong thực tế, tần số chỉ có ý nghĩa trực tiếp cho các sóng hình sin. Tuy nhiên, mọi âm thanh đều có thể làm vỡ thành một tập các sóng hình sin. Ta có thể tạo bất cứ âm thanh nào bằng cách thêm vào một tập các sóng hình sin phù hợp, cũng như có thể chia các âm thanh phức tạp thành các sóng hình sin riêng biệt, đơn giản. Ngoài ra, trong quá trình thu thanh số hoá, cần chú ý tới biên độ đỉnh để có thể tránh sự méo cắt (mà nó xuất hiện khi biên độ đỉnh vượt quá khuôn dạng lưu trữ) trong khi giữ tỷ lệ tín hiệu/nhiễu ở mức cao nhất có thể. 3. Định dạng dữ liệu Quá trình chuyển đổi âm thanh tương tự sang dạng âm thanh số cũng như việc lưu trữ âm thanh số liên quan tới 2 vấn đề: Lấy mẫu (sampling): Quá trình lấy mẫu liên quan tới việc tính toán một cách tuần hoàn tín hiệu tương tự, và sử dụng các mẫu này thay cho tín hiệu gốc trong quá trình xử lý. Lượng tử hoá (quantization): Quá trình xử lý các mẫu tương tự với độ chính xác không xác định và làm tròn chúng. 3.1. PAM (Pulse Amplitude Modulation) Trong thực tế, các bộ chuyển đổi DAC và ADC thường xuyên sử dụng dạng PAM (Pulse Amplitude Modulation) như một khuôn dạng trung gian, trong đó âm thanh được coi như một chuỗi các xung, và biên độ của mỗi xung (độ cao) biểu diễn độ mạnh của âm thanh tại điểm đó. Hình 2.4: PAM 3.2. PWM (Pulse Width Modulation) Ngoài ra, ta còn dạng biểu diễn khác là PWM (Pulse Width Modulation), cũng giống như PAM, đây là dạng biểu diễn mỗi mẫu như một xung, nhưng nó sử dụng độ rộng hay khoảng kéo dài của xung (thay cho biên độ) để biểu diễn độ mạnh của âm thanh. Hình 2.5: PWM 3.3. PCM (Pulse Code Modulation) Đây là dạng biểu diễn mỗi mẫu như một chuỗi các xung, mà các xung đó biểu diễn mã nhị phân (code binary) của nó. Nhưng biểu diễn dạng này rất khó xác định đâu là điểm bắt đầu và kết thúc của mỗi mã. Tuy nhiên, không khó khăn để có thể khắc phục điều này, ví dụ như ta có thể xây dựng các mã theo một dạng riêng để không có mã nào chứa 3 số 1 liên tiếp (111) và sau đó chèn 111 vào tín hiệu tại điểm bắt đầu của mỗi mã. Trong bộ nhớ máy tính, các mã nhị phân liên tiếp được lưu trữ như các số. Thông thường, dữ liệu âm thanh dạng PCM được lưu trữ với 8 hay 16 bits (1 hay 2 bytes) mỗi mẫu. Hình 2.6: PCM 3.4. Tần số lấy mẫu Nói chung, các hệ thống lấy mẫu âm thanh đều được đặc trưng bởi tần số lấy mẫu (đơn vị: mẫu/giây hay Hz) (sampling rate), đây là số các mẫu được sử dụng để biểu diễn một giây của âm thanh. Và Harry Nyquist (1889-1976) đã khám phá ra rằng, một tín hiệu âm thanh đã được lấy mẫu có thể tạo lại một cách chính xác bất cứ âm thanh nào mà tần số của nó nhỏ hơn một nửa tần số lấy mẫu. Do đó, một nửa tần số lấy mẫu thường xuyên được tham chiếu như một giới hạn Nyquist (Nyquist limit). Khi xét tới âm thanh số, ta phải xét tới hiệu ứng “aliasing” bởi có thể có nhiều sóng hình sin có thể phát sinh ra các mẫu như nhau nên có khả năng chọn nhầm tín hiệu. Đối với quá trình thu thanh thì điều đó không quan trọng bởi một bộ lọc thông thấp được kèm vào quá trình chuyển đổi số-tương tự sẽ gỡ bỏ các thành phần tần số cao. Tuy nhiên, đó thực sự là một vấn đề trong quá trình tổng hợp âm thanh số. Thông thường, nên làm việc trên các tệp âm thanh với dạng dữ liệu không nén. Một khi đã nén, chương trình xử lý sẽ phải giải nén mỗi khi sử dụng, và với bất cứ lưu đồ (giải thuật) nén nào cũng đều gây nguy hiểm tới chất lượng âm thanh, không kể đến thời gian dùng để giải nén. Vì thế các tệp âm thanh số dùng để phát lại (playback) không nên sử dụng dạng nén. 4. Khuôn dạng lưu trữ 4.1. Khuôn dạng chung Khi ghi âm, âm thanh có thể được lưu dưới dạng tệp. Có nhiều khuôn dạng tệp âm thanh khác nhau. Và 3 dạng chính là: Dạng tự nhiên: như các tệp có đuôi WAV, AIF... các tệp này cho âm thanh tốt song thời gian truyền lâu. Dạng nén: các tệp Shock wave, Quick Time, MPEG... để phát lại cần có phần mềm đặc biệt. Ưu điểm là kích thước nhỏ, nhưng mất thời gian giải nén, và chất lượng giảm. Dạng MIDI: khuôn dạng đơn giản, kích thước nhỏ, thuận lợi trong việc soạn thảo âm thanh, nhưng chất lượng phụ thuộc vào thiết bị. Nói chung, các tệp âm thanh số được lưu trữ trong một khuôn dạng tương ứng với header của loại đó. Một số khuôn dạng như sau: AU: là các tệp có đuôi .au. Hỗ trợ các tệp dạng mono và stereo với độ phân giải từ 8bit tới 16bit, tần số lấy mẫu trong khoảng 8KHz tới 48KHz. Nguyên gốc trên nền UNIX, song cũng hỗ trợ bởi các ứng dụng PC và MAC. AIFF: là các tệp có đuôi .aif (Audio Interchange File Format). Hỗ trợ tệp âm thanh không nén dạng mono, stereo hoặc khuôn dạng đa kênh (multichannel). Độ phân giải và tần số lấy mẫu trong phạm vi rất rộng, đạt tới chất lượng CD (16bit, lấy mẫu 44KHz). Nguyên gốc trên nền Macintosh nhưng cũng hỗ trợ trên PC và UNIX. WAV: là các tệp có đuôi .wav (Waveform Audio). Hỗ trợ dạng mono, stereo, hoặc khuôn dạng đa kênh với tần số lấy mẫu 44KHz, 16bit mẫu. Khuôn dạng WAV nguyên gốc trên nền Windows, hiện nay đây là dạng tệp âm thanh phổ biến trên Internet. WAV tương tự cấu trúc .aif nhưng khác phần đầu thông tin (header). MID: là các tệp có đuôi .mid (Musical Instrument Data Interchange). Hỗ trợ dữ liệu Standar MIDI File (SMF) trên hệ thống trang bị MIDI playback (với một số khuôn dạng âm thanh tổng hợp). Không có yêu cầu thiết lập đặc biệt nào đối với các bộ duyệt (browser) các tệp âm thanh được lưu trữ trong một khuôn dạng đặc biệt với tần số lấy mẫu và độ phân giải riêng biệt. Phần đuôi (phần mở rộng của tệp) và header của tệp được chèn vào một cách tự động khi thực hiện lưu tệp, ngoài ra còn có các thông tin bộ duyệt cần thiết để khởi đầu khi phát lại. 4.2. Chuyển đổi khuôn dạng Có nhiều trình ứng dụng có thể chuyển đổi các tệp âm thanh số từ kiểu này sang kiểu khác. Hầu hết các chương trình xác định khuôn dạng tệp âm thanh qua phần mở rộng của tệp. Tuy nhiên, nên xác định qua các khuôn dạng tệp. Các công cụ chuyển đổi có AWave và SoX. AWave Với một máy PC chạy Windows 95, AWave là một bộ chuyển đổi tệp âm thanh. Nó không chạy trên Win 3.1 thậm chí với mã mở rộng win32. Nếu chỉ có một máy tính cũ và bộ soạn thảo dạng sóng âm thanh không cho phép lưu tệp âm thanh trong một khuôn dạng đặc biệt, tốt nhất nên dùng SoX. SoX SoX là viết tắt của Sound Exchange, bộ dịch tệp tổng hợp chấp nhận nhiều khuôn dạng tệp khác nhau, bao gồm .au, .hcom, .raw, .st, .voc, .auto, .cdr, .dat, .wav, .aif, .snd và các dạng khác. Các phiên bản của SoX tương thích trên Unix và Dos. Nó xác định khuôn dạng tệp từ đuôi tệp song nó cũng tự động xác định các đặc điểm. SoX cũng có thể chuyển đổi tần số lấy mẫu và các phép xử lý hiệu ứng âm thanh. Ví dụ như chuyển tệp .au thành .wav với dòng lệnh sau: sox filename.au filename.wav Chương 3 khuôn dạng tệp âm thanh 1. Khuôn dạng lưu trữ 1.1. Au/ Snd Dạng tệp Au là đơn giản và hiện nay được sử dụng khá rộng rãi cho sự phân tán trên mạng Internet, và cho sự tích hợp vào các ứng dụng Java và Apples. Đây là dạng chuẩn được sử dụng trong các máy tính NeXT và Sun, và có rất nhiều kiểu dữ liệu. Nó tổ chức trên các máy tính Sun giống như sự kết xuất (dump) của dữ liệu âm thanh m-Law. Sau đó các header cơ sở được thêm vào để làm cho việc định danh các tệp này được dễ dàng hơn và để cho việc chỉ định dạng âm thanh một cách rõ ràng. Dạng được biết đến như SND trên các máy tính NeXT. Thuận lợi cơ bản của Au là tính đơn giản. Header định danh mọi tham số quan trọng, và dữ liệu âm được lưu giữ như một khúc đơn. Nên việc viết mã lệnh để đọc header của tệp Au là đơn giản. Bất lợi duy nhất là header kèm vào độ dài tổng thể của dữ liệu âm thanh, mà độ dài dữ liệu này thường không được biết trước. Để giải quyết vấn đề này, trong chương trình đọc dữ liệu tệp Au, ta thiết lập một độ dài giả tạo ở mức cao, và thêm một biến kiểm tra để dừng chương trình khi đã đọc đến cuối tệp hay khi vừa đọc hết độ dài giành riêng. Thông thường, không nên thiết lập độ dài dữ liệu âm thanh về 0. Sau đây là khuôn dạng của Au header: Độ dài Mô tả 4 Magic string: .snd 4 Định vị của dữ liệu âm thanh từ đầu tệp (ít nhất là 28) 4 Số bytes của dữ liệu âm thanh 4 Dạng âm thanh 4 Tốc độ mẫu (mẫu/giây) 4 Số các kênh truyền N Mô tả văn bản tuỳ chọn (ít nhất 4 bytes) N Dữ liệu âm thanh Phần lớn các tệp Au chứa header như minh hoạ trên. Đặc biệt 4 bytes đầu là “.snd”. Có nhiều tệp cũ hơn mà bản thân chúng định danh như dạng Au (chúng sử dụng phần mở rộng .au), nhưng chúng không có phần header này. Sau đây là một vài mã hoá dạng âm thanh được dùng cho các tệp Au. Mã hoá Mô tả 1 8-bit m-Law G.711 2 8-bit linear 3 16-bit linear 4 24-bit linear 5 32-bit linear 6 Floating-point sampled 7 Double-precision float sampled 8 Fragmented sampled data 10 DSP program 11 8-bit fixed-point samples 12 16-bit fixed-point samples 13 24-bit fixed-point samples 14 32-bit fixed-point samples 18 16-bit linear with emphasis 19 16-bit linear compressed 20 16-bit linear with emphasis and compression 21 Music kit DSP commands 23 ADPCM G.721 24 ADPCM G.722 25 ADPCM G.723.3 26 ADPCM G.723.5 27 8-bit A-Law G.711 Trong đó 3 dạng được sử dụng rộng rãi là: 8-bit m-Law (thường được lấy mẫu tại tần số 8,000Hz), 8-bit linear, và 16-bit linear. Các dạng còn lại thường được sử dụng trên các hệ thống NeXT và Sun. Đặc biệt, các dạng DSP là các dạng NeXT riêng, và các phiên bản dạng dấu phẩy động (floating-point) nói chung nên được tránh, bởi chúng rất hiếm khi có thể cài đặt được giữa các hệ thống (dĩ nhiên dạng m-Law G.711 là rất gọn nhẹ, chủ yếu chúng là dạng 8-bit dấu phẩy động). Nói chung, dạng Au là dạng tệp lưu trữ rất đơn giản nên ta thường chuyển đổi các tệp âm thanh sang dạng Au và sau đó sử dụng nó như một dạng cơ sở cho các quá trình xử lý tiếp theo. 1.2. Voc Dạng của Sound Blaster và Sound Blaster Pro. Đây là dạng chỉ đáp ứng các âm 8-bit; dạng đơn (mono) cho 44.1 kHz, và các âm nổi (stereo) cho 22 kHz. Các tệp .Voc có thể chứa thông tin cho sự lặp lại và tính trầm (silence). Tệp Voc bao gồm một header với các khối dữ liệu theo sau. Một vài khối dữ liệu chứa dữ liệu âm thanh hiện thời; những khối khác chứa các thông tin về định dạng hay dữ liệu trợ giúp khác. Khởi đầu tệp Voc được thiết kế cho các bộ xử lý họ Intel, mọi số dạng “multi-byte” được lưu trữ khởi đầu với byte thể hiện ít nhất. Định danh tệp Voc Mọi tệp Voc bắt đầu với một ký hiệu dài 20-byte, chứa các từ “Creative Voice File” và đặc tính Control-Z. Đặc tính Control-Z là dấu hiệu cuối tệp (end-of-file) cho MS-DOS; sự hiển diện của nó đảm bảo rằng toàn bộ tệp không thể được in hay soạn thảo một cách ngẫu nhiên trên hệ thống đó. Voc Header Header chứa một giá trị ký hiệu (signature value) và một phiên bản tệp. Chú ý rằng giá trị 26 (hex 1A), là một dấu hiệu kết thúc tệp trong các hệ thống MS-DOS. Thông thường, mã hoá phiên bản tệp là 266 (phiên bản 1.10) hay 267 (phiên bản 1.20). Sau đây là Voc Header: Độ dài Mô tả 19 Xâu ký tự định danh: Creative Voice File 1 Byte value 26 (MS-DOS end-of-file) 2 Kích thước tổng của header, thường là 26 2 Mã hoá phiên bản tệp: phần chính*256+phần phụ 2 Check value: 4,659 - phiên bản tệp Khi cài đặt, do header có thể được mở rộng nên cần thiết bỏ qua bất cứ dữ liệu nào mà nó có thể theo sau các thông tin chuẩn. Các khối dữ liệu Để xử lý một tệp Voc, cần phải đọc và xử lý các khối dữ liệu theo trình tự mà chúng xuất hiện trong tệp. Có một vài trường hợp mà trong đó các khối khác nhau có thể chỉ định cùng một dữ liệu; sự chỉ định đầu tiên thường gối lên các phần tiếp theo. Sau đây là khuôn dạng của một khối dữ liệu của tệp Voc: Độ dài Mô tả 1 Dạng khối 3 Độ dài dữ liệu: n n Dữ liệu Các dạng khối quan trọng nhất là khối kết thúc (dạng 0), các khối mở rộng (dạng 8 và 9), và khối dữ liệu âm thanh (dạng 1). Khối kết thúc (dạng 0) Khối kết thúc là một sự ngoại lệ cho khuôn dạng khối. Nó gồm một byte 0 đơn, không gắn thêm trường độ dài. Khối này đánh dấu sự kết thúc của tệp Voc. Khối dữ liệu âm thanh (dạng 1) Khối dữ liệu âm thanh bắt đầu với 2 bytes chỉ định tần số lấy mẫu và phương thức nén. Tiếp theo đó là dữ liệu âm thanh thực sự. Mã hoá tần số lấy mẫu được tính toán từ tần số lấy mẫu với công thức: 256 - (1,000,000/tần số lấy mẫu). Sau đây là các mã hoá phương thức nén: Mã hoá Mô tả 0 Dữ liệu dạng PMC unsigned 8-bit 1 Nén, 4 bits/mẫu 2 Nén, 2.6 bits/mẫu 3 Nén, 2 bits/mẫu 4 Dữ liệu dạng PCM signed 16-bit 6 CCITT A-Law 7 CCITT m-Law 512 Creative Labs 16-bit to 4-bit ADPCM Chú ý rằng, các giá trị trên 3 là chỉ sử dụng cho các khối mở rộng dạng 9. Và, một tệp Voc có thể chỉ chứa duy nhất một khối dữ liệu âm thanh. Dữ liệu âm thanh thêm vào có thể được lưu trữ trong một khối âm liên tiếp. Khi đọc dữ liệu, cần quan tâm tới dữ liệu âm thanh gốc (âm thanh chưa được xử lý) từ tệp, cần phải biết số bytes dữ liệu gốc dữ lại trong khối hiện thời. Dạng Voc đã được phát triển thêm bằng cách thêm vào các dạng khối mới mà nó định rõ khối âm thanh. Nên cần thận trọng để không viết đè lên bất cứ tham số nào mà có thể nó đã được thiết lập bởi một khối trước đó. Khối âm thanh liên tiếp (dạng 2) (Sound Continuation Block) Một tệp Voc có thể chỉ có một khối dữ liệu âm thanh dạng 1. Tuy nhiên, dữ liệu âm thanh có thể cần phải được làm vỡ ra qua các khối multiple. Điều này thường xuyên xuất hiện bởi ta muốn chèn thêm vài dạng khối khác (như một dấu hiệu vòng lặp) trong phần giữa của dữ liệu âm thanh. Dữ liệu âm thanh tiếp theo được lưu trữ trong các khối âm thanh liên tiếp dạng 2. Khối âm thanh liên tiếp chỉ chứa dữ liệu về mẫu âm thanh. Nó không lặp lại bất cứ thông tin định dạng nào từ khối dạng 1 trước đó. Khối trầm (dạng 3) (Silence Block) Với mục đích để giảm kích thước tổng của dữ liệu, một vài phân đoạn có thể được thay thế bởi các khối trầm (silence blocks), biểu thị một quãng trầm. Dữ liệu của khối này chứa một số kích thước 2-byte biểu thị số các mẫu của quãng trầm để sử dụng và 1 byte chứa mã tần số lấy mẫu. Theo lý thuyết, điều này cho phép quãng trầm sử dụng một tần số lấy mẫu khác so với âm thanh. Nhưng trong thực tế, tần số lấy mẫu được sử dụng ở đây nên đồng nhất với tần số lấy mẫu của âm thanh trước đó. Khối đánh dấu (dạng 4) (Marker Block) Dữ liệu cho khối đánh dấu là một số kích thước 2-byte. Số này có thể được sử dụng bởi các ứng dụng multimedia cho việc đồng bộ các sự kiện. Ví dụ, một ứng dụng về sự trượt có thể thay đổi sự hiển thị mỗi lần nó thấy khối đánh dấu để quá trình trượt ăn khớp với quá trình biểu diễn âm thanh. Các giá trị trong khoảng 0 tới 65,536 được bảo lưu và không nên được sử dụng. Khối văn bản (dạng 5) (Text Block) Dữ liệu là một xâu ký tự dạng null-terminated của dữ liệu dạng ASCII. Dạng này có thể được sử dụng để lưu trữ thông tin về quyền tác giả hay các dữ liệu dạng văn bản khác. Vòng lặp (dạng 6 và 7) (Repeat Loops) Các khối dạng 6 và 7 được sử dụng để cài đặt vòng lặp trong một tệp Voc. Khối dạng 6 được đặt tại phần đầu của phân đoạn được lặp, và khối dạng 7 đánh dấu sự kết thúc của vòng lặp. Dữ liệu cho dấu hiệu bắt đầu bao gồm một số kích thước 2-byte chỉ định lượng thời gian thêm vào mà phân đoạn này nên được lặp (một số đếm 0 có nghĩa là dữ liệu nên chỉ được phát một lần). Khối kết thúc không có dữ liệu. Khối mở rộng (dạng 8) (Extension Block) Khối mở rộng dạng 8 không có trong các phiên bản trước đây của tệp Voc. Nó đã được thêm vào để đáp ứng cho các tệp âm thanh dạng stereo. Khi xuất hiện, nó luôn ở trước khối dữ liệu âm thanh dạng 1, và nó ghi đè lên tần số lấy mẫu và thông tin nén trong khối dữ liệu âm thanh. Sau đây là cấu trúc dữ liệu khối mở rộng dạng 8: Độ dài Mô tả 2 Mã tần số lấy mẫu 1 Mã phương thức nén 1 Chế độ: 0 - mono; 1 - stereo Dữ liệu trong khối này sao chép ở mức độ lớn thông tin trong khối dữ liệu âm thanh. Đặc biệt, mã tần số lấy mẫu là một dạng có độ chính xác cao hơn so với mã hoá được sử dụng trong khối dữ liệu, ngoài ra mã phương thức nén là như nhau. Thông tin duy nhất thực sự mới là số các kênh truyền. Với dữ liệu âm thanh dạng stereo, dữ liệu âm thanh trong các khối dạng 1 và 2 sẽ luân phiên các mẫu trái và phải. Thông thường 2-byte mã hoá tần số lấy mẫu được tính toán theo công thức 65,536 - 256(1,000,000/tần số lấy mẫu). Tuy nhiên, cho các âm thanh dạng stereo, nên gấp đôi tần số lấy mẫu trước khi sử dụng dạng này. Sự thay đổi này dẫn đến chương trình không hiểu được phần cuối mở rộng này trong khi phát các mẫu được chèn vào tại tần số chủ yếu giành cho âm thanh. Cho sự tương thích về sau, mã hoá tần số lấy mẫu trong khối dữ liệu âm thanh dạng 1 nên thường xuyên được thiết lập cho byte bậc cao của mã hoá tần số lấy mẫu này. Khối mở rộng (dạng 9) (Extension Block) Giống như khối mở rộng dạng 8, khối dạng 9 đã được giới thiệu để thêm vào các khả năng mới. Đặc biệt, khối dạng 9 đáp ứng các phương thức nén phụ và lưu trữ thông tin về dạng âm thanh theo kiểu trực tiếp hơn. Khi xuất hiện, nó ở trước khối dạng 1 hay 8 và thông tin trong nó chèn lên thông tin trong các khối này. Khối dạng 9 lưu trữ thông tin âm thanh theo kiểu mà nó khác xa so với các khối dạng 1 hay 8. Đặc biệt, tần số lấy mẫu được lưu trữ một cách trực tiếp hơn so với quá trình được mã hoá. Hơn nữa, tần số lấy mẫu không được điều chỉnh cho số các kênh truyền. Trường số bits cho mỗi mẫu (bits-per-sample) sẽ xắp xếp từ 2 (cho dữ liệu đã được nén) tới 16 (cho dữ liệu PCM dạng 16-bit). Còn lại 4 bytes cuối cùng được dành cho sự mở rộng sau đó. Cho sự tương thích về sau, nếu có thể, nên tạo một khối dạng 8 theo sau các khối dạng 9. Tuy nhiên, do khối dạng 9 đưa vào một loạt các mã hoá phương thức nén mới nên điều này không phải thường xuyên có thể thực hiện được. Sau đây là cấu trúc dữ liệu của khối mở rộng dạng 9: Độ dài Mô tả 4 Tần số lấy mẫu 1 Số bits dùng cho mỗi mẫu 1 Số kênh truyền: 1- mono; 2 - stereo 2 Mã phương thức nén 4 Phần mở rộng Đọc tệp Voc Hiện nay, chỉ khối có giá trị trong khoảng từ 0 tới 9 là được định danh. Do đó, nên bỏ qua bất cứ khối không được nhận dạng nào. Khi đọc các khối, cần thiết phải quét qua các khối dữ liệu đầu tiên để nhận được các tham số cần thiết về định dạng dữ liệu. Điều này chỉ có nghĩa là quá trình đọc các khối kế tiếp cho tới khi tìm thấy một khối dữ liệu âm thanh hay khối kết thúc. Và do có một chuỗi các dạng khối mà chúng có thể định rõ các tham số về âm thanh, nên cần lưu lại các giá trị này để thiết lập. Nói chung, việc đọc phần lớn các tệp Voc mà chúng chỉ chứa dữ liệu PCM trở nên đơn giản hơn so với các tệp khác chèn thêm các khối trầm (silence blocks), các khối không bị nén, và dữ liệu âm thanh thông thường cần được giải mã. Để thực hiện việc đọc này, có thể quan sát dạng khối hiện thời và quyết định, hoặc bỏ qua nó (nếu không chứa dữ liệu âm thanh), điền đầy vào bộ nhớ đệm các mẫu 0 (đối với các khối trầm), hay yêu cầu dữ liệu từ bộ giải nén. 1.3. Wave/ Riff Đây là dạng của Microsoft Windows. Các tệp Wave của Windows ứng dụng cho cả 2 dạng tệp âm thanh nổi (stereo) và dạng đơn (mono) với một tập các độ phân giải và tần số lấy mẫu. Kiểu tệp này cho phép sự định rõ RIFF (Resource Information File Format), và cho phép thông tin phụ của người sử dụng được nhúng vào và được ghi cùng với tệp âm thanh. Dạng âm thanh PCM dùng cho Windows chuẩn chứa dữ liệu đã được mã hoá, dữ liệu đã được định dạng theo kiểu điều biến mã xung dạng không bị nén. Do dạng tệp Wave là một dạng âm thanh tự nhiên được Microsoft Windows sử dụng, nên nó trở thành một trong các dạng âm thanh phổ biến nhất. Nói chung, cấu trúc của nó được phát triển dựa trên dạng khởi đầu Interchange File Format (IFF) được Electronic Arts phát triển cho việc sử dụng trên Amiga. IFF cũng định hình khuôn dạng cơ sở của dạng âm thanh Aiff của Apple. Tiếp theo IFF, Microsoft định nghĩa một dạng tệp chung được gọi là Resource Interchange File Format (RIFF). Tệp Riff được tổ chức như một tập các khúc gài vào nhau. Và hai biến dạng chung là: tệp Wave (hay Wav) lưu trữ âm thanh; và tệp AVI lưu trữ các hình ảnh video. Đặc tính chung của các tệp Riff và Iff Do tệp Wave là một dạng đặc biệt của tệp Riff, nên trước hết ta nói về những đặc trưng cơ bản cơ bản của dạng RIFF. Trong đó ta chú tâm tới các biến thể IFF khác, bao gồm Aiff và IFF/8SVX. Một tệp Riff bao gồm một tập hợp các khúc xếp chồng. Mỗi khúc chứa một mã độ dài 4 ký tự (như RIFF, fmt, hay LIST; các mã ngắn hơn được chèn thêm các khoảng trống). Mã này chỉ định khuôn dạng của khúc. Ví dụ, một khúc fmt chứa các thông tin về khuôn dạng âm thanh. Tiếp theo đó là dạng khúc với một giá trị kích thước 4-byte, chỉ ra kích thước của dữ liệu được khúc đó mang theo. Trường kích thước trong khúc RIFF ít hơn kích thước tệp tổng thể 8-bytes do không tính đến dạng khúc và kích thước. Một vài dạng khúc, như các khúc RIFF và LIST, được gọi là các “container chunks” mà chúng chứa đựng các khúc khác. Dữ liệu của "container chunk" bắt đầu với một mã độ dài 4 ký tự chỉ ra dạng của dữ liệu chứa trong khúc đó. Ví dụ, khúc RIFF trong minh hoạ trên có mã là WAVE, chỉ ra rằng nó chứa các dữ liệu về âm thanh. Các tên khúc bên trong có thể có nghĩa khác nhau, phụ thuộc vào các container xung quanh. Do khúc fmt được chứa trong RIFF Wave container, nên nó chỉ định khuôn dạng của dữ liệu âm thanh. Trong một dạng container khác, nó có thể chứa các thông tin khác. Cấu trúc tổng quát của một tệp Wave Đây là khuôn dạng phổ biến nhất để lưu trữ âm thanh số trong thế giới PC. Nó được thiết kế cho các ứng dụng multimedia chạy dưới Microsft Windows. Tệp Wav lưu giữ các mẫu dạng sóng của một hoặc nhiều kênh theo các tần số lấy mẫu. Tệp Wav tự mã hoá và mô tả dữ liệu của nó trong phần mềm mà ta sử dụng. Nó không giới hạn độ dài tệp, có thể lên tới 4GB. Một tệp Wave là một dạng đặc biệt của tệp Riff, và mọi tệp Riff đều bắt đầu với các ký tự RIFF. Tiếp theo đó là 4-byte độ dài và mã định dạng. Tệp Wav theo cấu trúc RIFF (Microsoft’s Resouce Interchange File Format), nên cấu trúc gồm các phần nhỏ gọi là khúc (chunk). Có hai loại khúc được dùng trong tệp .Wav: khúc dữ liệu (data chunk), như một định danh biểu diễn độ dài và bản thân dữ liệu; và khúc định dạng (format chunk) chứa các dữ liệu mô tả thông tin trong nó. Khuôn dạng chung tệp Wave như sau: Hình 3.1: Khuôn dạng tệp Wave Do có rất nhiều tệp Wave có cùng cấu trúc cơ sở này, nên nhiều chương trình xử lý các tệp Wave giống như chúng có một header ấn định. Điều này tạo thuận lợi cho việc viết các tệp Wave dài như khi chỉ viết các dữ liệu PCM và thiết lập một cách thích đáng các trường kích thước. Sau đây là mô tả dạng tệp Wave cơ bản: Kích thước Mô tả 4 Dạng khúc: RIFF 4 Kích thước tệp tổng thể trừ 8 4 Dạng RIFF container: WAVE 4 Dạng khúc: fmt 4 Độ dài dữ liệu khúc định dạng: thông thường là 16 16 Dữ liệu khúc định dạng 4 Dạng khúc: data 4 Độ dài dữ liệu âm thanh n Các mẫu âm thanh hiện thời Tệp Wave có thể có các khúc khác trong chúng. Đặc biệt, khúc dữ liệu đơn đôi khi được thay thế bằng bởi một LIST container mà nó chứa các khúc slnt (chỉ ra các quãng trầm) và các khúc dữ liệu với các dữ liệu âm thanh. Đọc tệp Wave Trong dạng IFF gốc, cần thấy rõ rằng các khúc khác nhau có thể xuất hiện theo bất cứ thứ tự nào. Vì vậy, rất có thể một vài dạng tệp Wave có thể có khúc dữ liệu âm thanh trước khúc định dạng. Và, sự thể hiện của bất kỳ khúc nào đều phụ thuộc vào cả dạng của khúc và dạng của container kèm theo. Nguyên tắc chung của RIFF và các dạng tương tự là nên bỏ qua bất cứ khúc nào mà ta không thể nhận dạng được. Một cách để truy cập những tệp như vậy là đọc lướt toàn bộ tệp và tạo ra một sự ánh xạ trong bộ nhớ với sự định vị và dạng của mỗi khúc. Sau đó, có thể định vị các khúc một cách riêng biệt tuỳ theo yêu cầu. Tuy nhiên, sự tiếp cận này, mặc dù chi tiết, nhưng lại có một trở ngại lớn: nó yêu cầu phải có sự hiệu lực toàn bộ tệp ngay lập tức. Đặc biệt, nếu ta quan tâm tới quá trình truyền một tệp Wave qua mạng và quá trình phát nó giống như dữ liệu được nhận, ta có thể bỏ qua toàn bộ tệp và định vị các khúc trước khi ta bắt đầu phát. Ngoài ra, có một cách tiếp cận khác, thay vào việc ánh xạ sự định vị cho mỗi khúc, ta có thể đọc tệp từ phần đầu cho tới cuối và xử lý các khối ngay trong quá trình đọc. Và, trong các tệp Riff (như trong mọi dạng IFF-derived file), mỗi khúc chiếm giữ một số bytes trong tệp. Nếu kích thước của khúc hiện thời là lẻ, thì sẽ có một byte phụ của phần thêm vào cần được bỏ qua. Và có thể, khúc mà chúng ta vừa xoá lại là khúc cuối cùng của container của nó. Do đó, nếu bất cứ container còn lại ít hơn 8-bytes thì cần phải được kết thúc bởi vì một header của khúc yêu cầu ít nhất 8 bytes. Khúc fmt Khúc fmt chứa thông tin định dạng âm thanh hiện thời. Những nội dung chính xác của sự thay đổi khúc fmt phụ thuộc vào phương thức nén. Bảng sau chỉ ra khuôn dạng khúc fmt sử dụng cho dữ liệu PCM. Kích thước Mô tả 2 Mã phương thức nén 2 Số kênh truyền 4 Số mẫu trong mỗi giây 4 Số bytes trung bình trong mỗi giây 2 Block alignement 2 Số bits cho mỗi mẫu 2 Số bytes của thông tin thêm vào n Thông tin về bộ nén phụ Mã hoá dữ liệu Gần 100 bộ mã về phương thức nén đã được đăng ký với Microsoft cho việc sử dụng trong các tệp Wave. Tệp Wave có thể sử dụng các phương thức nén m-Law hay A-Law. Sau đây là một vài khuôn dạng: Mã hoá Mô tả 0 Không nhận dạng được 1 PCM 2 Microsoft ADPCM 6 ITU G.711 A-Law 7 ITU G.711 m-Law 17 IMA ADPCM 20 ITU G.723 ADPCM 49 GSM 6.10 64 ITU G.721 ADPCM 80 MPEG 65535 Experiment Tuy nhiên, tốt nhất nên sử dụng các bản tin dạng văn bản hơn là một số mã hoá. Nên đôi khi một phương thức nén tối ưu hay phổ biến cũng không nên sử dụng (ví dụ như phương thức nén MS ADPCM). Khúc dữ liệu Khúc dữ liệu (Data chunk) của dạng Wav theo chuẩn mẫu RIFF. Bốn byte đầu xác định khúc dữ liệu với các ký tự “data” trong mã ASCII. Theo sau là bốn byte biểu diễn độ dài dữ liệu. Cuối cùng là các dữ liệu được mã hoá trong một số byte cho trước. Các khúc văn bản Sự thay đổi của các khúc tạo ra sự sinh động dạng văn bản. Các khúc này có thể xuất hiện trong bất cứ dạng tệp Riff nào, chứ không phải chỉ trong các tệp Wave. Tên của chúng đều bắt đầu với một chữ "I" để chỉ ra rằng chúng được dùng cho việc lưu trữ thông tin. 1.4. Aiff/ Aiff-C/ Aif/ Snd Đây là dạng tệp âm thanh chuẩn của Apple. Giống như các dạng tệp Aiff và Wave của Windows ứng dụng các âm thanh nổi và đơn, 16-bit hoặc 8-bit, và phạm vi rộng của tần số mẫu. Và dạng tệp này (giống như dạng Wave của Windows) có thể chứa bất cứ một trong các dạng dữ liệu. Dạng Aiff là một sự lựa chọn tốt cho sự tương thích với PC/Mac. Khi truyền sang Mac, ta có thể thêm 4 mã ký tự “AIFF” vào trong phần gốc của tệp để thừa nhận nó (Macintosh định danh tệp qua các tài nguyên của nó, mà nó được gỡ ra khi tệp được mở trên máy PC). Tuy nhiên, rất nhiều các ứng dụng của Mac mà chúng đáp ứng Aiff có thể thừa nhận các dữ liệu PCM mà không cần các định danh này. Apple chấp nhận dạng IFF của Electronic Arts cho việc sử dụng trên các máy Macintosh nhưng làm một chút thay đổi bằng cách tạo ra một dạng tệp tương tự với tên Audio Interchange File Format (AIFF). Dạng gốc Aiff không đáp ứng cho các âm thanh đã được nén, nên một dạng biến thể khác - Audio Interchange File Format Extension for Compression (AIFF-C hay AIFC) - đã được phát triển. Các tệp Aiff và Aiff-C nói chung là đồng nhất. Cấu trúc của một tệp Aiff cũng giống như tệp Riff. Tuy nhiên, các tệp Aiff lưu trữ một số nhiều bytes trong dạng MSB và sử dụng các tên khúc khác nhau. Mọi tệp Aiff đều bao gồm một khúc FORM đơn và tại vị trí ngoài cùng nhất. Các dạng Aiff hay AIFC có thể chứa một số hay tất cả các khúc. Trong đó các khúc quan trọng nhất là COMM và SSND, mà chúng được thể hiện trong mọi tệp Aiff hay AIFF-C, và khúc FVER có trong mọi tệp AIFF-C. Sau đây là bảng các khúc trong AIFF: Dạng khúc Mô tả FVER Phiên bản của tệp AIFF-C COMM Thông tin về khuôn dạng lưu trữ thông tin SSND Dữ liệu âm thanh MARK Marker COMT Chú thích MIDI Dữ liệu MIDI AESD Thông tin quá trình thu thanh APPL Khúc ứng dụng riêng biệt NAME Tên AUTH Tác giả (c) Thông tin về quyền tác giả ANNO Phần chú thích Mặc dù Aiff và Aiff-C hầu như là đồng nhất, nhưng dạng Aiff-C vẫn tồn tại. Trong các tệp AIFF, cũng như phần lớn các biến thể IFF, bộ đọc bỏ qua bất cứ dữ liệu nào mà nó không được nhận dạng. Đặc biệt, nếu ta thêm vào các dạng khúc mới hay thông tin mới vào phần cuối của một loại khúc đang tồn tại, thì dữ liệu mới đó sẽ bị bỏ qua bởi một bộ đọc cũ hơn. Dạng gốc Aiff không chỉ định rõ phương thức nén. Theo cách đó, ta sẽ phải thêm vào một dạng khúc mới hay mở rộng khúc COMM đang tồn tại (mà nó chứa thông tin về khuôn dạng âm thanh). Trong trường hợp khác, các bộ đọc cũ hơn sẽ bỏ qua thông tin này và cố gắng phát dữ liệu âm thanh mà không có bộ giải nén phù hợp. Để tránh điều này, Apple đã đưa ra một dạng "container" mới, FORM/AIFC. Từ khi có dạng "container" khác này, các bộ phát cũ hơn mà chúng quan tâm tới FORM/AIFC sẽ không thể phát được tệp. Có ít các bộ phát hơn mà chúng có thể hiểu được cả hai dạng "container" sẽ biết tìm kiếm cho mã phương thức nén được thêm vào cho khúc COMM, và kết quả là có thể xử lý cả 2 dạng "container" hầu như là tương tự nhau. Để khắc phục điều này, người ta đã thêm vào một khúc FVER để tạo sự rõ ràng. Khúc này chứa bộ mã dựa trên ngày của sự chỉ định có liên quan. Nếu bộ đọc tệp không nhận dạng được bộ mã này, thì nó không nên phát tệp đó bởi vì dữ liệu mới phải được hiểu rõ để phát tệp này. Tốt nhất nên thay đổi bộ mã FVER một cách ngẫu nhiên. Đọc các tệp Aiff Các tệp Aiff đều là các tệp IFF, và mỗi tệp Aiff đều bắt đầu với 4 ký tự FORM. Tiếp theo đó là một độ dài 4-byte và một mã loại. Trong các dạng gốc IFF, các khúc có thể xuất hiện theo bất cứ thứ tự nào. Vì vậy, có thể có một vài tệp Aiff có khúc dữ liệu âm thanh trước khúc định dạng mà nó chỉ định rõ cách dữ liệu được lưu trữ. Do đó, cũng giống như tệp Wave, ta có thể đọc lướt toàn bộ tệp để tạo một ánh xạ các định vị hoặc xử lý các khúc ngay trong quá trình đọc. FORM Aiff Container Một tệp Aiff chứa một FORM container đơn, mà container đó chứa mọi khúc khác trong tệp. Hơn nữa, rất dễ để có thể điều khiển khúc FORM. Chỉ cần đánh dấu nó như một container và đọc theo dạng container. Khúc COMM Khúc COMM lưu trữ thông tin về khuôn dạng âm thanh. Phần lớn các khuôn dạng âm thanh lưu trữ các giá trị như tần số lấy mẫu như các số nguyên. Nên để tăng độ chính xác, Apple sử dụng dạng dấu phẩy động. Điều này tạo cảm giác cho các ứng dụng có độ chính xác cao như sản phẩm về phim ảnh hay video, nhưng nó cũng làm tăng độ phức tạp khi đọc và viết định dạng. Apple sử dụng khuôn dạng chính xác là dạng dấu phẩy động 80-bit. Trong đó, 16-bit đầu tiên được sử dụng cho một bit ký hiệu (sign bit) và một thành phần cơ số 2 kích thước 15-bit (15-bit base-2 exponent). Vì vậy, ta có thể hoàn toàn yên tâm khi bỏ qua ít nhất 32 bits thể hiện và chỉ sử dụng sự chuyển đổi số nguyên nhanh chóng này. Những nội dung chính xác của sự biến đổi khúc COMM phụ thuộc vào phương thức nén. Sau đây là khuôn dạng được sử dụng cho dữ liệu PCM hoàn chỉnh. Các kỹ thuật nén khác mở rộng dạng này với các thông tin phụ. Các tệp Aiff-C đáp ứng phương thức nén m-Law. Nội dung của khúc COMM: Kích thước Mô tả 2 Số kênh truyền 4 Tổng số các khung mẫu 2 Số bits trên mỗi mẫu 10 Số khung mẫu trong 1 giây (số dấu phẩy động 80-bit IEEE) 4 Mã phương thức nén n Tên phương thức nén Qua phần mềm hệ thống của Apple, các bộ mã mã hoá 4-byte được sử dụng để định danh các dạng dữ liệu và các thông tin quan trọng khác. Trong trường hợp AIFF-C, các bộ mã này định danh phương thức nén. Phần mềm Multimedia của Macintosh có thể dò tìm một mã âm thanh (sound codec) dựa trên 4-byte mã này, cho phép "codecs" được cài đặt một cách chủ động. Ngoài ra, tên phương thức nén có thể được thay đổi tuỳ theo các quá trình viết chương trình. Sau đây là một số bộ mã hoá khuôn dạng AIFF-C: Mã hoá Mô tả NONE PCM ACE2 Phương thức nén ACE 2:1 ACE8 Phương thức nén ACE 8:3 MAC3 Phương thức nén MACE 3:1 MAC6 Phương thức nén MACE 6:1 ulaw ITU G.711 m-Law ima4 IMA ADPCM Dữ liệu PCM Một tệp được viết với dữ liệu âm thanh PCM nên được viết như một tệp Aiff (chứ không phải dạng AIFC) cho sự tương thích về sau. Phần lớn các tệp AIFF/AIFC được lưu trữ theo cách này. Các mẫu PCM được lưu trữ theo khuôn dạng "signed"; các mẫu multi-byte được lưu trữ MSB đầu tiên. Khúc SSND Khúc SSND lưu trữ dữ liệu âm thanh được nén hiện thời. Nó bắt đầu với 8-byte thông tin mà chúng thường xuyên không được sử dụng. Chính vì vậy, phương thức đọc các bytes là rất quan trọng. 1.5. IFF/8 SVX Dạng Amiga 8SVX là một dạng đơn 8-bit từ các máy tính Commodore Amiga, mà nó có thể được nén theo dạng mã hoá 4-bit Fibonacci delta, và có nhiều tần số lấy mẫu khác nhau. ý tưởng cơ bản của các dạng tệp xen kẽ đã được Electronic Arts phát triển cho việc sử dụng trên Commodore Amiga. Họ phát triển một dạng tệp phức tạp gọi là IFF (Interchange File Format) cho việc lưu trữ một chuỗi các dạng dữ liệu. Các tệp IFF có thể chứa một hình ảnh đơn giản, văn bản đã định dạng, hoạt ảnh, hay bất cứ tổ hợp nào của các dạng dữ liệu. Những nhà phát triển rất tự do trong việc tạo ra các loại khúc mới để lưu trữ các dạng dữ liệu riêng của họ. Cấu trúc của một tệp IFF cũng giống như các tệp Riff hay Aiff. Tuy nhiên các tệp IFF lưu trữ một số nhiều bytes trong dạng MSB, và có các tên khúc khác nhau. Mặc dù, ngày nay, IFF không được sử dụng thường xuyên, nhưng nó là dạng gốc của dạng RIFF và AIFF. Rất nhiều trong số các tài liệu về IFF gốc vẫn còn có thể ứng dụng được cho 3 khuôn dạng này. Thông thường, một tệp IFF bao gồm một khúc FORM đơn giản, khúc chỉ ra khuôn dạng của dữ liệu trong tệp. Khúc ngoài cùng nhất là khúc CAT hay LIST với một chuỗi các khúc FORM lồng vào nhau. Định danh các tệp IFF/8SVX Chỉ xét tới các tệp có một FORM container ngoài cùng đơn giản với dạng 8SVX (viết tắt của “8-bit sampled voice”). Có nhiều cách khác trong việc cấu trúc các tệp IFF, tuy nhiên, hiếm khi chúng được sử dụng. IFF là khuôn dạng âm thanh chung nhất của Amiga gồm có một FORM container với dạng 8SVX. Điều này thường xuyên được tham chiếu tới như IFF/8SVX. Dạng 8SVX đã được thiết kế cho việc điều khiển các nhạc cụ âm nhạc đã được số hoá. Dạng 8SVX có thể chứa một chuỗi các khúc. Sau đây là một vài trong số đó: Tên Mô tả VHDR Thông tin về khuôn dạng âm thanh NAME Tên của âm thanh (c) Thông tin về quyền tác giả AUTH Tác giả ANNO Phần chú thích BODY Dữ liệu âm thanh ATAK Attack RLSE Release Đọc tệp IFF Theo lý thuyết, các khúc trong một container được đưa đến có thể xuất hiện theo hầu hết bất cứ thứ tự nào. Điều này tạo nên sự phức tạp khi đọc một tệp IFF tuỳ ý. Nói chung, ta cần đọc các thông tin về định dạng dữ liệu (khúc VHDR) trước khi đọc các dữ liệu âm thanh (khúc BODY). Tuy nhiên, trong thực tế ta thường viết thông tin về định dạng dữ liệu (khúc VHDR) trước dữ liệu âm thanh (khúc BODY). Do đó, chỉ cần đọc trực tiếp tệp và xử lý các khúc ngay trong quá trình đọc. Khúc FORM Một tệp IFF chứa một FORM container đơn, mà nó chứa mọi khúc khác trong tệp, và khúc ngoài cùng nhất luôn là khúc FORM. Và để xử lý khúc FORM chỉ cần đánh dấu nó như một container và sau đó xử lý theo dạng container. Khúc VHDR Khúc VHDR chứa các thông tin cơ bản về khuôn dạng của dữ liệu âm thanh. Thông thường, IFF/8SVX được thiết kế như một khuôn dạng về nhạc cụ cho bản nhạc trong quá trình phát. Một tệp IFF/8SVX đơn chứa quá trình thu thanh của một nhạc cụ đơn. Khuôn dạng của khúc VHDR: Kích thước Mô tả 4 Các mẫu "one-shot" cho nốt nhạc cao nhất 4 Lặp lại các mẫu cho nốt nhạc cao nhất 4 Các mẫu trong mỗi chu kỳ cho nốt nhạc cao nhất 2 Các mẫu trong mỗi giây 1 Octaves trong khúc BODY 1 Phương thức mã hoá (0: PCM, 1: mã hoá dạng Fibonacci, 2: mã hoá dạng Exponential) 4 Âm lượng (65,536= mức âm lượng cao nhất) Một âm thanh IFF/8SVX bao gồm một phân đoạn "one-shot" khởi đầu và tiếp theo là phân đoạn "repeat". Khi được phát như một nhạc cụ, phân đoạn lặp có thể được lặp cho tới cuối nốt nhạc. Khi IFF/8SVX được sử dụng cho một quá trình thu thanh đơn giản, thậm chí như một nhạc cụ, độ dài phân đoạn lặp được thiết lập về 0. Quá trình phát một nhạc cụ số yêu cầu biến đổi âm thanh để tạo ra các nốt nhạc khác nhau. Với IFF/8SVX, có 2 kỹ thuật được sử dụng. Công cụ cơ bản là phát âm thanh theo các tần số (speed) khác nhau. Nếu ta biết cường độ (pitch) của nốt nhạc đã thu thanh và cường độ của nốt nhạc mà ta mong muốn, ta có thể điều chỉnh tần số phát lại để có thể đạt được bất cứ cường độ mong muốn nào. Các tệp IFF/8SVX cho phép lưu trữ một chuỗi các quá trình thu thanh của cùng một nhạc cụ tại các cường độ khác nhau nên ta có thể chọn quá trình thu thanh gần nhất với cường độ mong muốn, giảm tối đa sai số. Trường thứ 3 trong bảng trên là cường độ của nốt nhạc thu thanh cao nhất. Khúc BODY lưu trữ các nốt nhạc đã được thu thanh theo kiểu kế tiếp (nốt này tiếp theo nốt khác) mà bắt đầu là nốt có cường độ cao nhất. Mỗi nốt kế tiếp là một quãng 8 (octave) thấp hơn về cường độ so với nốt kế trước và được thu thanh tại tần số lấy mẫu khác. Ngoài ra, trường thứ 4 (số mẫu trong mỗi giây) được bỏ qua đối với các quá trình thu thanh nhạc cụ bởi vì thông tin về cường độ được lấy ra. Với các âm thanh thu thanh đơn giản, thông tin trong VHDR là không cần hay không được sử dụng. Trong trường hợp này, số vòng lặp các mẫu, các mẫu trong mỗi chu kỳ, và các trường octave được thiết lập về 0. Các tệp IFF/8SVX luôn là dạng mono. Để lựa chọn bộ giải mã, cần đảm bảo rằng khúc VHDR đã được đọc, sau đó sử dụng mã dạng này. Hơn nữa, phần lớn các tệp IFF/8SVX sử dụng dữ liệu âm thanh dạng PCM 8-bit. Khúc BODY Khúc BODY lưu trữ dữ liệu âm thanh đã được nén hiện thời. Các dữ liệu âm thanh được đọc từ khúc này. Các khúc văn bản Một loạt các khúc cần tới các phần chú thích dạng văn bản. Các khúc này có thể xuất hiện trong bất cứ dạng tệp IFF nào (bao gồm cả Aiff và Aiff-C). Mọi khúc này có cùng một khuôn dạng cơ bản; chúng chứa một chuỗi ký tự ASCII. 1.6. MIDI Mặc dù có thể lưu trữ một bài hát như dạng thu thanh Wave hay Au, nhưng có 2 lý do chính cho việc phải có các khuôn dạng âm nhạc riêng biệt. Trước hết đó là kích thước. Việc lưu trữ một dẫy các nốt nhạc sẽ tiện lợi hơn cho quá trình phát so với việc lưu trữ quá trình thu thanh toàn bộ bài hát. Lý do thứ hai là rất dễ dàng trong việc thay đổi. Nếu ta có một quá trình thu thanh buổi hoà âm, rất khó khăn trong việc tách biệt và thay đổi một nhạc cụ đơn, nhưng nếu được lưu trữ dưới dạng một dẫy các nốt nhạc thì ta sẽ dễ dàng soạn thảo nó. Các tệp MIDI chuẩn Một tệp MIDI là một chuỗi các khúc. Các khúc này có cùng một khuôn dạng chung giống như các khúc được sử dụng trong các tệp Aiff, Iff, và Wave. Mỗi khúc có 4 ký tự phân loại, một mã độ dài kích thước 4-byte (trong khuôn dạng MSB), và một vài dữ liệu. Tuy nhiên, khác với các khuôn dạng khác, các khúc MIDI không xếp chồng. Hiện nay, chỉ có 2 loại khúc. Khúc MThd chứa thông tin về header nói chung; và khúc MTrk chứa một rãnh đơn. Khúc MThd xuất hiện tại phần đầu của mọi tệp MIDI, và đây là dấu hiệu để định danh một tệp MIDI chuẩn. Khúc MIDI Header Khúc MThd chứa một chút các sự kiện cơ sở về tệp MIDI. Mọi giá trị này được lưu trữ trong khuôn dạng MSB. Sau đây là nội dung của khúc MIDI MThd: Bytes Mô tả 2 Dạng tệp 2 Số các rãnh 2 Khuôn dạng thời gian Có 3 loại tệp MIDI, chúng được phân loại tuỳ theo cách xử lý các rãnh: Tệp dạng 0 chỉ chứa duy nhất một rãnh. Một cách rõ ràng, đây là tệp dễ nhất để có thể phát, nên đây là dạng thông dụng cho các tệp quảng cáo. Tệp dạng 1 chứa rất nhiều rãnh mà chúng được phát một cách đồng thời. Một chương trình dùng để phát các tệp dạng 1 phải bằng cách nào đó san phẳng dữ liệu thành các dòng sự kiện đơn trước khi phát. Tệp dạng 2 chứa nhiều rãnh nhưng không thừa nhận bất cứ sự liên hệ nào giữa các rãnh. Nói chung, các tệp dạng 2 là không phổ biến. Các rãnh MIDI Chú ý rằng một rãnh là khác so với một kênh MIDI. Mặc dù đây là dạng chung cho các tệp multi-track để có thể phát mỗi rãnh trên một kênh khác nhau, và trong quá trình tổ hợp một bản nhạc có thể sử dụng số các rãnh tuỳ ý để có thể phát các rãnh trên các kênh khác nhau theo bất cứ kiểu mẫu nào. Mỗi rãnh MIDI là một danh sách các sự kiện, mà mỗi sự kiện có một “delta time” đặt trước. Mỗi khúc trong một tệp MIDI có một độ dài đã được ấn định, nên cần thận trọng khi rãnh hoá số các bytes được đọc để ta có thể biết khi nào dữ liệu rãnh kết thúc. Nếu đây không phải rãnh đầu tiên, thì cần phải đảm bảo rằng các sự kiện mới đã hoàn toàn được chèn vào trong bộ nhớ danh sách các sự kiện. Giống như bất kỳ danh sách mã chèn nào, quá trình chèn một sự kiện MIDI yêu cầu hai trường hợp sau: một, nếu sự kiện vào phần đầu của danh sách (trong trường hợp này cần phải cập nhật đầu đọc danh sách); hai, nếu sự kiện vào giữa danh sách (trong trường hợp này một container trỏ khác nhận sự cập nhật). Điều này làm tăng sự phức tạp bởi sự cần thiết chèn nó vào tại vị trí tạm thời chính xác và điều chỉnh các độ trễ một cách thích hợp. Ngoài ra, để duy trì không gian, các tệp MIDI sử dụng các số nguyên biến độ dài để lưu trữ các “delta times” và các giá trị tới hạn khác. Điều này cho phép các giá trị nhỏ (như giá trị 0) có thể được lưu trữ trong một byte đơn đồng thời cho phép các giá trị đạt tới 32 bits. Delta times Các sự kiện MIDI xuất hiện tại một số thời điểm xác định. Có 2 cách để đánh dấu các thông tin này: Lưu trữ thời gian tuyệt đối tại mỗi thời điểm mà sự kiện xuất hiện, hay có thể lưu trữ các quãng thời gian giữa các sự kiện. Mỗi sự kiện được đặt trước bởi một số chỉ ra số các ticks để tách biệt nó với sự kiện trước đó. Khoảng tồn tại chính xác của một tick phụ thuộc vào khuôn dạng thời gian đã được ấn định trong header, và cũng có thể được thay đổi bởi các sự kiện riêng biệt trong tệp. Các sự kiện MIDI Một sự kiện MIDI là một gói các dữ liệu mà nó chỉ rõ một số các sự kiện âm nhạc, như việc nhấn và nhả phím. Byte đầu tiên của gói là byte trạng thái, mà nó định rõ dạng của sự kiện, và đôi khi, là kênh truyền. Các bytes trạng thái thường xuyên có thiết lập bit cao. Còn lại là các byte dữ liệu, mà chúng không bao giờ có thiết lập bit cao. Sự phân biệt này là rất quan trọng. Theo cách chung, các kênh truyền MIDI được đánh số từ 1 tới 16, và các nhạc cụ MIDI là từ 1 tới 128. Tuy nhiên, các mã hoá số xắp hàng từ 0 tới 15 và 0 tới 127 một cách tương ứng. Ta sẽ thêm hay bớt 1 khi chuyển đổi giữa các mã số hoá và ngôn ngữ MIDI. Running Status Để tạo "wire protocol" thêm hiệu quả, MIDI sử dụng một kỹ thuật gọi là “running status”, kỹ thuật này bỏ qua các bytes trạng thái lặp. Khi đọc một tệp MIDI, nếu gặp một byte dữ liệu, trong khi ta đang cần một byte trạng thái, thì ta dùng lại trạng thái trước đó. Để tạo cho kỹ thuật này thêm hữu hiệu, có một quy ước rằng một “note-on event” với một vận tốc (velocity) thiết lập về 0 cũng giống như một “note-off event” với một vận tốc ngầm định là 64. Như vậy, một dẫy dài các notes trên một kênh truyền đơn có thể được kiểm soát với chỉ 2 bytes cho mỗi sự kiện. Quản lý các sự kiện MIDI Các tệp MIDI thường được lưu trữ như các rãnh đơn. Mặc dù các sự kiện trong mỗi rãnh được lưu trữ theo thứ tự tạm thời, luồng sự kiện mà nó nhận được để phát là một tổ hợp của các rãnh này. Hơn nữa, các sự kiện trong mỗi rãnh (như những sự thay đổi về nhịp độ) tác động lên quá trình phát lại của các sự kiện trong các rãnh khác. Cho các tệp dạng 1, cần phải đọc mọi sự kiện vào bộ nhớ trước khi phát chúng. Để đạt được điều này, cần lưu trữ một danh sách liên kết đơn của các sự kiện MIDI. Phần lớn các sự kiện gồm một byte trạng thái và một cặp byte dữ liệu. Và cũng cần phải lưu trữ giá trị độ trễ và số rãnh mà sự kiện này xuất hiện. Vài sự kiện MIDI riêng biệt có thể chứa một lượng tuỳ ý các dữ liệu, nên cần thêm một cấu trúc phụ để nắm giữ dữ liệu đó khi cần đến. Phần lớn các sự kiện MIDI có độ dài cố định. Ví dụ như một “note-on event” có 2 bytes dữ liệu tiếp theo các bytes trạng thái. Khuôn dạng MIDI Khuôn dạng MID là các tệp điều khiển âm thanh trong multimedia. MIDI là một hệ thống hoàn chỉnh không chỉ có khuôn dạng xác định mà còn có các tín hiệu và hệ thống phần cứng. Các tệp MIDI lưu giữ một dòng các lệnh cho các hệ thống tổng hợp (synthesizer) MIDI. Các tệp được xây dựng từ các khúc (chunks). Có hai loại khúc: header chunk và track chunk. Mỗi tệp MIDI gồm một header chunk và một hoặc nhiều track chunk. Mỗi khúc có 4 byte để nhận dạng. Các dấu hiệu theo sau 4 byte xác định độ dài dữ liệu trong khúc (không kể 8 byte dữ liệu mô tả), cho phép một khúc dài 4GB. Header chunk Bắt đầu bằng các ký tự “MThd” trong dạng mã ASCII, header chunk thường có độ dài 16byte, mã hoá như 06 00 00 00 theo khuôn dạng "little-endian" (Intel) trong tệp MIDI. 8byte đầu của header chunk theo dạng word biểu diễn phạm vi dữ liệu trong tệp. 0, (trên đĩa 00 00): tệp định nghĩa một rãnh đa kênh đơn. 1, (trên đĩa 01 00): tệp giữ một hoặc nhiều rãnh được chơi cùng một lúc. 2, (trên đĩa 02 00): tệp nén một hoặc nhiều mẫu rãnh đơn mà chúng độc lập với quá trình chơi liên tiếp. Vị trí từ tiếp theo (byte thứ 11 và 12) biểu thị số track chunk riêng biệt được chứa trong tệp. Khuôn dạng này cho phép tới 65.535 chunk dữ liệu trong một tệp. Từ cuối cùng trong header chunk (byte thứ 13 và 14) xác định gía trị trung bình của delta-time trong một track chunk. Dữ liệu trong các byte đó lấy một trong hai dạng. Khi bit MSB = 0 thì 15 bit thấp hơn biểu thị số tick trong một phần tư nốt nhạc. Khi bit MSB = 1 nó biểu diễn thời gian trong một time code và byte thấp hơn biểu thị số tick trong một khung SMPTE. Track chunk Bắt đầu với “MTrk” trong dạng mã ASCII, một track chunk bắt đầu với 8byte nhận dạng (4byte như “MTrk”, 4byte sau biểu diễn độ dài) theo sau là một track event. Mỗi track event có hai phần, một biến độ dài delta time (1 tới 4 byte) mô tả thời gian trước sự kiện và bản thân sự kiện. Sự kiện có thể là một trong số các dạng sau: một sự kiện MIDI (đơn giản là một bản tin về kênh truyền MIDI), một bản tin dành riêng của hệ thống (gọi là sysex event), hoặc một Meta event, không phải thông tin cho bộ tuần tự. Một bản tin dành riêng của hệ thống là một chuỗi dữ liệu có dạng ba phần: một byte nhận dạng, thường là F0(Hex) hoặc F7(Hex), theo sau là một tới ba byte biểu diễn độ dài chuỗi dữ liệu và bản thân chuỗi dữ liệu. Một Meta event gồm bốn phần: byte đầu tiên thường là FF(Hex), tiếp theo là mã kiểu 1byte. Tiếp theo là một biến biểu diễn độ dài của dữ liệu trong Meta event. Phần cuối cùng là dữ liệu Meta event. 1.7. Mod/ Sam Mặc dù MIDI là một dạng lưu trữ nhạc tốt, nhưng nó cũng có một vài vấn đề. Khởi đầu, MIDI đã được phát triển cho việc kết nối với nhiều loại phần cứng về nhạc. Một bộ tổng hợp sẽ chỉ đáp ứng cho một tập ấn định các âm thanh nhạc cụ, và mỗi bộ tổng hợp là khác nhau. Thậm chí, mỗi nhạc cụ với cùng một tên nhưng lại nghe có vẻ khác nhau, nên nhiều tệp MIDI chỉ nghe chuẩn trên một vài bộ tổng hợp nào đó. Chính vì vậy, người ta sử dụng thêm dạng tệp Mod. Bằng cách bao gồm các âm thanh nhạc cụ đã được thu thanh, các tệp Mod độc lập với các tính năng của bất cứ bộ tổng hợp hay card âm thanh nào. Chính vì vậy, các tệp Mod nghe có vẻ như giống nhau trên mọi hệ thống. Khác với MIDI, các tệp Mod được cấu trúc dựa quanh các beat. Mỗi beat tương ứng với một quãng thời gian và nó hoàn toàn mô tả những gì xẩy ra trong quãng đó. Một kết quả khác là các tệp Mod có thể chỉ phát một số giới hạn các nốt nhạc đồng thời. Mặc dù điều này có thể là một trở ngại cho các nhà soạn nhạc, nhưng nó lại là một ưu điểm cho những người lập trình, những người khai thác giới hạn này để cung cấp quá trình phát lại thêm xác thực. Các tệp Mod không thể được định danh một cách xác thực giống như một vài dạng khác. Dạng biến thể phổ biến Pro Tracker chứa 4-byte ký hiệu, nhưng lại không định vị tại phần đầu của tệp. Các dạng biến thể Mod khác không những sử dụng các dấu hiệu khác nhau, mà lại định vị chúng tại các vị trí khác nhau trong tệp. Khuôn dạng chung của Mod Khuôn dạng tệp Mod có thể được coi như một dạng nén mới. Nó định danh một chuỗi các mẫu hình lặp trong phần nhạc nên việc lưu trữ trở nên rất gọn nhẹ. Ví dụ, nó lưu trữ nốt nhạc đã thu thanh cho mỗi nhạc cụ, mà nó sẽ được mở rộng thành một chuỗi các âm thanh trong quá trình phát lại. Nó cũng lưu trữ các mẫu hình, các phân đoạn ngắn của bản nhạc mà chúng có thể được lặp hay phát lại theo bất cứ trình tự nào để tạo sự thuận lợi cho các chuỗi lặp nốt nhạc. Các tệp Mod chung nhất cho phép tới 31 âm thanh nhạc cụ khác nhau. Mỗi âm thanh được đặc trưng bởi các mẫu đã được số hoá với một phân đoạn lặp tuỳ chọn, cùng với một âm lượng ngầm định và tham số “finetune”. Tham số này cho phép tần số phát lại chính xác (và cường độ) có thể được điều chỉnh trên mỗi nhạc cụ cơ bản. Timing Đơn vị thời gian chuẩn được sử dụng trong một tệp Mod là “tick”, thường là 1/50 giây. (Tốc độ này tương ứng với tần số vẽ lại theo chiều dọc trong phiên bản European/PAL của Amiga. Một vài tệp Mod không chuẩn có thể lấy giá trị 1/60 giây, tương ứng với phiên bản US/NTSC của Amiga. Rất nhiều trình phát các tệp Mod cho phép điều chỉnh tần số tick). Tệp Mod cho phép một chuỗi các thay đổi về âm thanh xuất hiện trong mỗi tick. Ví dụ như, một nốt nhạc được phát với sự rung sẽ có âm lượng của nó được điều chỉnh trên mỗi tick. Tuy nhiên, những sự thay đôỉ về nốt nhạc có thể chỉ xuất hiện tại phần đầu của mỗi beat mới. Thông thường, một beat là 6 ticks, mặc dù giá trị này cho phép được điều chỉnh tuỳ ý. Các beats cũng được quy chiếu tới như các hàng, bởi vì rất nhiều trình soạn thảo tệp Mod hiển thị mỗi beat trên một hàng của phần hiển thị văn bản. Notes Mỗi beat là một tập hoàn chỉnh các nốt nhạc(notes). Mỗi nốt nhạc bao gồm một số nhạc cụ, một thời đoạn (period), và một mã tác động. (Một vài khuôn dạng biến thể khác cũng lưu trữ trong mỗi nốt nhạc mức âm lượng). Số nhạc cụ và thời đoạn tương ứng một cách trực tiếp với phần cứng về âm thanh của Amiga. Nếu cả số nhạc cụ và thời đoạn là 0, thì nốt nhạc trước đó nên tiếp tục được phát. Nếu chỉ một trong hai số này bằng 0, thì một nốt nhạc mới sẽ bắt đầu nhưng giá trị 0 sẽ được thay thế bởi giá trị trước đó. Beats Một beat bao gồm một sự định rõ nốt nhạc riêng cho mỗi kênh. Thông thường có 4 kênh, nhưng các dạng biến thể khác có thể có 6 hay 8 kênh. Ngoài ra, mỗi beat còn có một khoảng xác định, thường là 6 ticks, mặc dù khoảng này có thể được thiết lập lại. Patterns Các tệp Mod được thiết kế cho quá trình lưu trữ âm nhạc, mà chúng có các phân đoạn lặp. Một mẫu hình (pattern) lưu trữ tới 64 beats. Tại mỗi tần số lấy mẫu phát lại bình thường, nó chỉ phát nhạc trong vòng hơn 7 giây. Một tệp Mod có thể có tới 64 mẫu hình. Một vài dạng Mod khác không lưu trữ các mẫu hình, mà chúng lưu trữ một danh sách liên tiếp các beats. Playlist Playlist là một danh sách chứa tới 128 số mẫu hình. Nói chung, một trình phát một tệp Mod phức tạp hơn so với trình phát các khuôn dạng Wave và AIFF, mặc dù không phức tạp như trình phát MIDI. Cấu trúc chung của một tệp Mod như sau: Độ dài Mô tả 20 Tên bài hát 30 cho mỗi nhạc cụ Dữ liệu về nhạc cụ 1 Độ dài của playlist 1 Số các mẫu hình (chỉ trong các tệp cũ) 128 Playlist 4 Signature 1024 cho mỗi mẫu hình Các mẫu hình Tiếp theo là dữ liệu về mẫu hình nhạc cụ. Phần "Signature" được sử dụng để chỉ ra khuôn dạng chính xác của tệp. Nhưng phần này không xuất hiện tại cùng một định vị trong mọi khuôn dạng Mod. Sau đây là một vài trong số các ký hiệu chung nhất: Kí hiệu Mô tả M.K Chữ ký chung nhất. M!K! Giống như dạng trên, nhưng có nhiều hơn 64 mẫu hình. FLT4 Tương tự như M!K! FLT8 Mỗi beat có 8 kênh 6CHN Mỗi beat có 6 kênh 8CHN Mỗi beat có 8 kênh 1.8. MPEG (Moving Pictures Expert Group) Đây là một chuẩn mà ISO đã phát triển (5/1988) cho việc nén một chuỗi các hình ảnh video. Mặc dù các chuẩn MPEG là rất nổi tiếng cho việc nén các hình ảnh video, nhưng chúng cũng đáp ứng cho việc nén các âm với chất lượng cao. Hiện nay, có 3 dạng chuẩn MPEG chính: MPEG-1, MPEG-2, MPEG-3. Sự phân biệt giữa các tệp MPEG âm thanh và hình ảnh video là rất quan trọng. Các chuẩn MPEG xác định 3 khuôn dạng lưu trữ. Một tệp có thể chứa một dòng hình ảnh (video stream), một dòng âm thanh (audio stream), hay một dòng hệ thống (system stream) là dòng mà nó được chèn vào xen kẽ một vài tổ hợp của các dòng âm thanh và hình ảnh. Cả 3 dạng tệp này đều được sử dụng rộng rãi. Nói chung chuẩn MPEG khác so với vài chuẩn khác. ở đây, ta chỉ xét tới khuôn dạng của một dòng bit (bitstream) MPEG, và cách mã hoá dòng bit đó chứ không chỉ ra kỹ thuật nén. Một cách chủ yếu, một dòng bit âm MPEG định rõ giá trị tần số của âm thanh và cách giá trị đó thay đổi theo thời gian. Theo cách để lưu trữ khoảng trống, bộ nén sẽ loại bỏ thông tin một cách có lựa chọn. Chuẩn chỉ rõ cách thông tin giữ lại được mã hoá và bộ giải mã có thể cấu trúc các mẫu âm PCM từ dòng bit MPEG. Bằng cách đặt lại quá trình xử lý mã hóa không xác định, các bộ cài đặt có thể tự do sử dụng một chuỗi các kỹ thuật để quyết định xem thông tin nào là quan trọng. Những kỹ thuật này có thể bao gồm các bộ mã hoá đơn giản cho các ứng dụng chất lượng thấp hơn, và các bộ mã hoá được chi tiết hoá cho các dạng âm thanh riêng biệt (ví dụ như quá trình nén chất lượng cao cho dàn nhạc có thể khác với quá trình nén chất lượng cao cho tiếng nói). Cấu trúc chung Giống như nhiều kỹ thuật nén định hướng phần cứng, dữ liệu đã được nén MPEG được định nghĩa như một dòng các bit. Một dòng bit MPEG bao gồm các khung (frame) dữ liệu nén. Mỗi khung chứa một "frame header" mà nó xác định khuôn dạng dữ liệu đó. Để giải mã dữ liệu, cần phải rãnh hoá các bytes vào, định danh và phân tích các "frame header", và sử dụng thông tin trong các header để giải nén các khung riêng biệt. Frame Header của MPEG Một frame header luôn là 32 bits và được xắp hàng trên một byte đường biên. 12 bits đầu tiên đều là 1, cho sự đồng bộ hoá; các bits còn lại được chỉ ra trong bảng sau. 12 bits giá trị 1 là "syncword". Nếu bộ giải mã mất rãnh nơi mà nó đang định vị, thì nó có thể tìm về phía trước cho "syncword" tiếp theo và định vị lại từ đó. MPEG frame Header: Byte Bits Mô tả 0 8 Cho sự đồng bộ, mọi giá trị đều bằng 1 1 4 Cho sự đồng bộ, mọi giá trị đều bằng 1 1 ID: 0 chỉ ra rằng các phần mở rông MPEG-2 đang được sử dụng 2 Tầng: 11=tầng 1, 10=tầng 2, 01=tầng 3, 00=dự trữ 1 Bit bảo vệ: 0 nếu CRC được kèm vào 2 4 Chỉ số tần số bit 2 Chỉ số tần số mẫu 1 Chèn thêm: 1 nếu có một khe phụ 1 Private 3 2 Chế độ: 00=stereo, 01=joint stereo, 10=dual channel, 11=mono 2 Sự mở rộng chế độ: dải tần thấp nhất cho âm thanh dạng stereo về cường độ 1 Bản quyền: 1, nếu có 1 Nguồn gốc: 1, nếu đây là bản gốc 2 Nhấn mạnh Các syncword giả có thể gây khó khăn cho bộ giải mã trong việc đồng bộ lại một cách đáng tin cậy. Mặc dù chuẩn này đảm bảo rằng syncword giả sẽ không xuất hiện trong một dòng âm thích hợp, chúng có thể xuất hiện nếu dữ liệu mã hoá bị các lỗi gây hư hại. Nếu bộ giải mã biết thông tin phụ về dòng bit vào (ví dụ như nó có thể đã biết để trông chờ một dòng bit MPEG-1 Layer 1), nó có thể sử dụng các bits header phụ này như một syncword mở rộng. Chuẩn này cũng cung cấp một dạng mã hoá vòng CRC để được lưu trữ theo sau header. CRC cung cấp một dạng kiểm tra lỗi cho header và phần lớn các dữ liệu âm thanh nhạy cảm đã được mã hoá. Nếu quá trình kiểm tra CRC bị trượt, thì bộ giải mã có thể bỏ qua khung này (làm trầm đầu vào, hay tạo bản sao của khung trước đó để che dữ liệu đã mất), đồng bộ lại, và tiếp tục với khung thích hợp tiếp theo. Các mã hoá về tần số lấy mẫu của MPEG : MPEG - 1 MPEG - 2 Mã hoá Tần số lấy mẫu Tần số lấy mẫu 00 44,100 22,050 01 48,000 24,000 10 32,000 16,000 11 Reserved Reserved Frame header chỉ ra tần số lấy mẫu của dữ liệu âm thanh không bị nén (samples/giây) và tần số của dữ liệu đã nén (bits/giây). Các giá trị này được lưu trữ ở phần header của mỗi khung. Mặc dù nó không đồng nhất cho các bộ mã hoá trong việc thay đổi tần số lấy mẫu giữa các khung, nhưng nó khá hợp lý trong việc thay đổi tốc độ bit (bit rate) giữa các khung. Bằng cách thay đổi tốc độ bit giữa các khung, MPEG có thể sử dụng các tốc độ bit hiện thời (trong bảng mã hoá tốc độ bit sau). Trong một vài trường hợp, tốc độ bit "free" có thể được sử dụng mặc dù chúng có một vài giới hạn. Ngoài ra, để tránh làm sai các "syncword", không nên sử dụng giá trị toàn 1. Bảng các mã hoá tốc độ bit MPEG: Mã hoá Tốc độ bit MPEG-1 Tốc độ bit MPEG-2 Tầng 1 Tầng 2 Tầng 3 Tầng 1 Tầng 2 Tầng 3 0000 Free Free Free Free Free Free 0001 32 32 32 32 8 8 0010 64 48 40 48 16 16 0011 96 56 48 56 24 24 0100 128 64 56 64 32 32 0101 160 80 64 80 40 40 0110 192 96 80 96 48 48 0111 224 112 96 112 56 56 1000 256 128 112 128 64 64 1001 288 160 128 144 80 80 1010 320 192 160 160 96 96 1011 352 224 192 176 112 112 1100 384 256 224 192 128 128 1101 416 320 256 224 144 144 1110 448 384 320 256 160 160 1111 * * * * * * MPEG-1 đáp ứng cho 4 thiết lập về kênh truyền. Các chế độ âm thanh nổi thông thường và kênh truyền kép có thể lưu trữ 2 dòng dữ liệu nén một cách độc lập. Thiết lập về âm thanh nổi được kết nối sử dụng ít dữ liệu nhất bằng cách chia sẻ một vài thông tin giữa 2 kênh. Điều này tạo thuận lợi cho các chương trình đáp ứng dạng âm thanh nổi có sự khác nhau giữa các kênh trái và phải là rất nhỏ. Các khe và khung (Slots và Frames) Các khung của MPEG được tính bằng các khe (slots). Với tầng 1, một khe là 4 bytes; với tầng 2 và 3 là 1 byte. Sự định vị của header tiếp theo là rất đơn giản, nên dễ dàng xác định tốc độ bit của dữ liệu vào, tần số lấy mẫu của âm ra, cũng như số các mẫu xuất hiện trong một gói: 384 mẫu cho tầng 1; và 1,152 mẫu cho tầng 2 và 3. Từ các số liệu này ta có thể tính độ dài trung bình của khung. Ngoài ra, mọi thông tin về header được lặp lại trong mỗi khung. Phần lớn thông tin naỳ cho phép thay đổi với mỗi khung (mặc dù các thông số về tầng, chỉ số, và tần số lấy mẫu không nên thay đổi). Bởi vì khi một tốc độ bit được thay đổi giữa các header, thì rất có thể sẽ tạo ra một sai số lớn. Một cách khác, để có thể sử dụng một tốc độ bit không chuẩn ta nên sử dụng một mã hoá "free bit rate". Dĩ nhiên, trong trường hợp này ta không thể tính toán trực tiếp độ dài khung, do đó, nên quy định rằng nếu tốc độ bit là "free" thì độ dài khung không được thay đổi (ngoại trừ cho khe đã được chỉ rõ của quá trình chèn thêm). Điều này cho phép tính toán độ dài khung đầu tiên bằng cách tìm kiếm trước cho header tiếp theo và sau đó sử dụng lại giá trị đó cho các khung được giữ lại. 1.9. VBA , VBase ADPCM (.VBA) Đây là dạng Dialogic VOX với một đầu đọc nhỏ, cho phép các phân đoạn được đánh dấu. Nó sẽ chỉ ghi dưới dạng âm 16-bit đơn, và giống như các dạng ADPCM khác, nó nén theo kiểu 4-bits/mẫu (tỷ lệ 4:1). Khác với dạng Dialogic VOX, thông tin về tần số lấy mẫu được giữ lại với tệp. 1.10. VCE, NMS VCE (.VCE) Natural MicroSystems (NMS) ADPCM. Đây là dạng biến đổi G.721 ADPCM được sử dụng trong các ứng dụng trong ngành điện thoại. Một tệp .vce chứa một bản tin về giọng nói đơn với 2,3 hay 4-bit/mẫu tại tốc độ 8000 mẫu trong mỗi giây. Dạng này chỉ ứng dụng cho các dạng đơn, 16-bit tại tần số 8kHz. Tệp .vce là một tệp mỏng và không có đầu đọc. Các tệp .vce bội và có đầu đọc được chứa trong tệp .vox dạng NMS đơn. 1.11. TXT ASCII Text Data (.TXT) Dữ liệu có thể được đọc hoặc viết từ các tệp theo dạng văn bản chuẩn, mà trong đó mỗi mẫu được chia bởi một “carriage return” và các kênh được chia bởi ký tự “tab”. Các tuỳ chọn cho phép dữ liệu được chuẩn hoá trong khoảng giá trị –1.0 và 1.0, hoặc được viết hay đọc theo các giá trị nguyên. Một đầu đọc tuỳ chọn có thể được xếp trước các dữ liệu. Nếu không có header text, thì dữ liệu được thừa nhận là các số nguyên hệ 10 dạng 16-bit. Đầu đọc được định dạng như từ khoá: gồm các giá trị, SAMPLERATE, và NORMALIZED. Giá trị của NORMALIZED là TRUE hoặc FALSE. Ví dụ như: SAMPLES: 1582 BITSPERSAMPLE: 16 CHANNELS: 2 SAMPLERATE: 22050 NORMALIZED: FALSE 164 -1372 492 -876 vv... 1.12. SMP, SampleVision (.Smp) Dạng SampleVision được chương trình SampleVision của Turtle Beach sử dụng. Nó chỉ đáp ứng các dạng âm 16-bit đơn. 8-bit signed (.Sam) Dạng này rất phổ biến cho việc tạo các tệp dạng Mod, kể từ khi các âm trong các tệp Mod là dạng 8-bit. Rất nhiều trình soạn thảo Mod cho phép các mẫu được chèn vào từ các tệp, hoặc được xuất sang các tệp theo dạng này. Dữ liệu dạng nguyên 8-bit signed với phần mở rộng .Sam được thừa nhận là dữ liệu dạng nguyên 8-bit signed và không có đầu đọc. Tần số lấy mẫu thường là 22050Hz, nhưng hiện nay, giá trị này có thể được thay đổi. 1.13. VOX Dialogic ADPCM (.Vox) Dạng Dialogic ADPCM, nói chung, có trong các ứng dụng trong ngành điện thoại, đã được tối ưu cho các giọng có tần số lấy mẫu thấp. Nó chỉ ghi các âm dạng 16-bit đơn, và giống như các dạng ADPCM khác, nó nén theo kiểu 4-bits/mẫu (cho tỷ lệ 4:1). Dạng này không có đầu đọc, vì vậy bất cứ dạng tệp nào có phần mở rộng .Vox sẽ được thừa nhận là thuộc dạng này. Pika ADPCM (.VOX, *.*) Pika ADPCM cũng là dạng có trong các ứng dụng trong hệ thống điện thoại. Nó là phiên bản "nibble-reversed" của dạng Dialogic VOX chuẩn. Để ghi sang dạng Pika, tệp gốc phải là dạng đơn 8kHz 16-bit. 1.14. PCM, PCM Raw Data (.PCM) Một cách đơn giản, dạng này là sự kết xuất PCM cho mọi dữ liệu của tệp âm. Tệp không chứa các thông tin về đầu đọc. Nên ta không cần quan tâm tới việc lựa chọn tần số lấy mẫu, độ phân giải, cũng như số kênh truyền trong quá trình mở tệp. Bằng cách mở các dữ liệu âm thanh giống như PCM, ta có thể diễn xuất hầu như bất cứ dạng tệp âm thanh nào với vài ý tưởng về tần số lấy mẫu, số các kênh truyền, vv.. Ta cũng có thể biểu diễn dữ liệu như các dạng nén A-Law hay Mu-law. 1.15. DWD , DiamondWare Digitized (.DWD) Đây là dạng âm thanh được Sound Toolkit của DiamondWare sử dụng, đây là thư viện của chương trình mà nó cho phép nhanh chóng và dễ dàng thêm các tương tác mang tính đặc trưng cao vào các ứng dụng multimedia hay các trò chơi. Nó ứng dụng cả 2 dạng tệp (mono và stereo), với một tập các độ phân giải và tần số lấy mẫu khác nhau. 1.16. RA, RealAudio 3.0 (.RA) Đây là dạng nén Progressive Networks được sử dụng cho việc xắp xếp các âm thanh thời gian thực trên Internet. Các tệp RealAudio có thể được mã hoá bằng cách sử dụng các giải thuật khác nhau. Mỗi giải thuật là tối ưu cho một dạng âm và giải tần kết nối riêng. Ta có thể ghi sang dạng này từ dạng 8 hay 18-bit, âm đơn hay âm nổi, với tần số lấy mẫu thích hợp 8 kHz, 11.025 kHz, 16 kHz, 22.05 kHz, và 44.1 kHz. Ta cũng có thể sử dụng các nguồn âm nổi để tạo ra các tệp RealAudio âm đơn hay âm nổi, tuy nhiên không thể sử dụng tệp đầu vào dạng âm đơn để tạo ra tệp dạng âm nổi. Trong trường hợp này, cần phải chuyển sang dạng âm nổi trước quá trình ghi. 2. Thao tác với tệp âm thanh Từ các khuôn dạng tệp âm thanh đã có sẵn hay được tạo ra, ta tiến hành các chức năng soạn thảo, chuyển đổi một cách trực quan trên phần sóng âm tương ứng được hiển thị. 2.1. Thu thanh tạo tệp âm thanh Có hai dạng xử lý âm thanh số hoá trên Windows: Dạng thứ nhất được Microsoft gọi là "Wave Form Audio", dựa trên nguyên tắc số hoá sóng âm. MPC lưu chúng trên bộ nhớ hay trong tệp *.Wav trên đĩa từ. Các dữ liệu số này thông qua phần cứng có thể biến đổi lại thành âm thanh. Dạng thứ hai là âm thanh được lưu trữ dưới dạng MIDI. Dạng tệp này chỉ lưu trữ các thông tin điều khiển bộ tổng hợp phát ra âm thanh (lưu trữ các nốt nhạc thay cho việc lưu trữ toàn bộ quá trình thu thanh). Chính vì vậy, kích thước tệp *.Mid nhỏ hơn nhiều so với các tệp *.Wav. 2.2. Soạn thảo Tất cả các bộ soạn thảo dạng sóng thực hiện các chức năng Cut, Copy, và Paste giống như xử lý word. Khi xét một bộ soạn thảo, đầu tiên phải mở một tệp âm thanh xác định phương pháp yêu cầu cho phần được ghi. Nhiều chương trình chấp nhận kỹ thuật nhấn và kéo chuột để chiếu sáng phần sóng âm thanh được hiển thị. Như chương trình soạn thảo GoldWave dùng nhấn chuột trái để chọn điểm bắt đầu, nhấn chuột phải để chọn điểm cuối. Khi chơi lại phần âm thanh được chọn luôn đảm bảo các điểm bắt đầu và kết thúc mà không bị cắt chậm hoặc nhanh. Các phần âm thanh được copy có thể được lưu trữ dưới khuôn dạng tệp duy nhất, trộn chính xác với một sóng âm khác đã có, hoặc chèn vào trong một dạng sóng gốc tại một điểm đã chọn. 2.3. Phát âm Khi phát âm thanh ra loa, ta có thể khuếch đại mức âm lượng theo mong muốn. Quá trình khuếch đại âm lượng này được thực hiện trên dữ liệu tệp Wave (với các dạng tệp khác ta có thể chuyển đổi sang dạng tệp Wave trước khi phát). Sau đó, có thể thực hiện phát âm thanh theo ba chế độ: Phát toàn bộ tệp Wave theo đường dẫn lựa chọn. Chỉ phát phần sóng âm được lựa chọn. Phát phần sóng âm được tạo ra trong màn hình soạn thảo. Để xác định chế độ phát âm, ta tạo một biến kiểm tra xem có phần lựa chọn hay không: nếu biến có giá trị "false" (tức là không có phần sóng âm nào được lựa chọn thì sẽ phát toàn bộ tệp Wave; nếu bằng "true" thì sẽ phát phần sóng âm được lựa chọn hiện thời. Với phần sóng âm trong màn hình soạn thảo thì có thể có một tuỳ chọn riêng: ta có thể ghi phần sóng âm này dưới dạng một tệp Wave hoàn chỉnh, và sau đó phát toàn bộ tệp; hoặc phát trực tiếp các đoạn sóng âm theo trình tự được ghép trên màn hình soạn thảo. Chương 4 Hàm cửa sổ và lọc tín hiệu 1. Hàm cửa sổ Phương pháp cửa sổ là một trong 3 phương pháp chính để tổng hợp bộ lọc số (phương pháp cửa sổ, lấy mẫu tần số, và phương pháp lặp). Hơn nữa, một tín hiệu có độ dài hữu hạn N có thể được biểu diễn hoàn toàn qua phép biến đổi Fourier rời rạc DFT. Tuy nhiên không thể tính DFT cho một tín hiệu có độ dài vô hạn hoặc quá lớn. Cho nên, để nghiên cứu phổ của những tín hiệu như vậy, ta có thể tính xấp xỉ bằng cách chặt lấy một đoạn thích hợp để xử lý. Và việc quan sát tín hiệu x(n) bằng một đoạn xN(n) trong khoảng từ n0 tới n0 + N-1 tương đương với việc nhân x(n) với một hàm cửa sổ w(n- n0): xN(n) = x(n). w(n- n0) = (2.1) Việc nhân tín hiệu với hàm cửa sổ theo thời gian tương đương với việc nhân chập phổ của tín hiệu x(n) với phổ của cửa sổ: XN(f) = X(g)W(f-g)dg = X(f)*W(f) (2.2) Trong đó XN(f), X(f), và W(f) là biến đổi Fourier tương ứng của xN(n), x(n), và w(n). 1.1. Rectangular Đây là dạng cửa sổ đơn giản nhất. Ta chỉ việc nhân tín hiệu với tín hiệu chữ nhật để có được một khúc tín hiệu của x(n). xN(n) = x(n).RectN(n-n0) = x(n).wR(n-n0) (2.3) Trong đó: wR(n-n0) = RectN(n-n0) = (2.4) là hàm cửa sổ chữ nhật. 1.2. Hamming Hamming là dạng cửa sổ được phát triển từ dạng Hanning. Những sự thay đổi là rất nhỏ, nhưng các kết quả đạt được lại rất khác nhau. Lý do cho những sự thay đổi là chỉ các điểm tại phần bắt đầu và phần cuối của tín hiệu. Sau khi cửa sổ Hanning đã được áp dụng cho tín hiệu thì những điểm này phần lớn đều là 0. Điều đó có nghĩa là chúng ta mất đi các tần số mà chúng có trong các vùng đó của tín hiêụ. Mặt khác, độ phân giải tốt hơn nhiều cho vấn đề đó lại bị xếp chồng nhau. Trong quá trình tính toán phổ, tín hiệu thời gian thường cũng chứa cả phần nửa dữ liệu thứ hai được chứa trong phần tín hiệu thời gian liền trước đó. Hệ số xếp chồng có thể thay đổi và thường trong khoảng 50 tới 90%. Dạng tổng quát của cửa sổ Hamming: w(n) = (2.5) 1.3. Hanning Dạng tổng quát của cửa sổ Hanning: w(n) = (2.6) 1.4. Triangle (Bartlett) Với mục đích làm giảm các búp sóng phụ của cửa sổ chữ nhật WR(f), ta chọn một dạng cửa sổ khác dạng tam giác cân gọi là cửa sổ tam giác (Triangle hay Bartlett). wT(n) = (2.7) Lý do chọn hàm naỳ là có thể biểu diễn wT(n) như là tích chập của cửa sổ chữ nhật có độ rộng N/2 với chính nó: wT(n) = . RectN/2(n+N/4) * RectN/2(n+N/4) (2.8) Một hạn chế của cửa sổ tam giác là N phải là số chẵn để đảm bảo độ rộng của cửa sổ chữ nhật là N/2. Và với cửa sổ này ta đạt được các búp phụ giảm nhưng bề rộng búp chính (4/N) lại lớn hơn so với cửa sổ chữ nhật (2/N).\ 1.5. Black man Công thức tổng quát của cửa sổ Black man như sau: wB(n)N = (2.9) Trong các quá trình phân tích tần số, các nhà nghiên cứu đã cố gắng tìm ra một loại cửa sổ có sự rò rỉ nhỏ nhất. Cửa sổ Black man là một trong những dạng đầu tiên đạt tới yêu cầu đó. Dạng cửa sổ Black man đã được phát triển theo hướng nghiên cứu muốn tìm ra một dạng cửa sổ lý tưởng. Ngày nay, dạng cửa sổ lý tưởng đó được biết tới như cửa sổ Kaiser. Cửa sổ Black man trở nên rất gần với cửa sổ Kaiser. Tuy nhiên, cửa sổ Kaiser rất hiếm khi được sử dụng do nó yêu cầu sự tính toán của hàm Bessel của dạng đầu tiên. Hàm này không được biết rộng rãi như các hàm được yêu cầu trong sự tính toán của các cửa sổ Hanning, Hamming, hay Black man. Dù rằng thực tế, Kaiser đã được xuất bản vào năm 1974 dựa theo mã Fortran để tính toán hàm Bessels. Ngày nay, cửa sổ Kaiser không được sử dụng trong việc phân tích tần số. Real Function I0(X) DS=1.0 D=0.0 S=1.0 1 D=D+2.0 DS=DS*X*X/(D*D) S=S+DS IF(DS-.2E-8*S) 2, 1, 1 2 I0 = S Return End 1.6. Flat top Dạng cửa sổ này đã được thiết kế một cách riêng biệt cho việc xác định biên độ trong phổ. Chúng ta cũng thấy rằng dạng cửa sổ này có sự rò rỉ ít hơn so với cửa sổ chữ nhật và nhiều hơn so với cửa sổ Hanning. Nhưng đây không phải là mục đích của dạng cửa sổ này. Trong trường hợp xấu nhất, sai số về biên độ là 0.2%. 1.7. Exponent down Khi trong quá trình thực hiện sự phân tích động hệ thống, hàm chuyền đạt hệ thống (system transfer function) được gọi phải được truy nhập. Cho mục đích đó, các giá trị của tín hiệu thời gian về phía cuối của nó phải được tiến gần tới 0 hay bằng 0. Hiệu ứng mà thủ tục đó tạo ra trên phổ tần số có thể được quan sát bằng cách sử dụng cửa sổ này. 2. Lọc tín hiệu Trước khi tính FFT để có thể phân tích tín hiệu qua phổ tương ứng của nó, ta có thể sử dụng một bộ lọc không truy hồi, hay còn gọi là bộ lọc gây méo trước để làm rõ phổ của tín hiệu. Bộ lọc này có đáp ứng xung luôn hữu hạn. Hàm của bộ lọc như sau: H(z) = 1- a*z-1 , với a < 1. (2.10) Đây là bộ lọc thông cao (High pass filter). Bộ lọc có tác dụng nhấn mạnh thành phần bậc cao, loại bỏ các thành phần thông thấp, đặc biệt là các phần tử một chiều. Với bộ lọc này, tín hiệu ra chỉ phụ thuộc tín hiệu vào. Ngoài ra, do nhiễu là các thành phần tần số cao nên cũng cần thiết sử dụng một bộ lọc thông thấp nhằm loại bỏ nhiễu. Chương 5 FFt và cepstrum 1. FFT (Fast Fourier Transform) 1.1. Nguyên lý Biến đổi Fourier được thực hiện dựa trên nguyên lý rằng ta có thể dùng bất cứ hàm tuần hoàn theo thời gian x(t) nào và chuyển nó sang dạng một phép tổng xác định của các sóng hình sin hay hình cosin tương ứng với các tần số bắt đầu tại 0 và tăng dần theo cấp số nhân một số nguyên lần của tần số cơ bản f0=1/T, với T là chu kỳ của x(t). Dĩ nhiên, ta không thể thực hiện một tổng không xác định của bất cứ loại nào trong sự tính toán thực, nên chúng ta phải thiết lập một tập xác định các hình sin và cosin. Điều này tạo thuận lợi cho đầu vào được lấy mẫu một cách số hoá, khi chúng ta quy định rằng số các mẫu tần số ra và các mẫu thời gian vào là như nhau. Hơn nữa, thật may mắn khi mọi quá trình thu thanh âm số hoá đều có độ dài xác định. Chúng ta có thể giả thiết rằng, hàm x(t) là tuần hoàn, và chu kỳ có cùng độ dài như quá trình thu thanh. Mặt khác, hãy coi qúa trình thu thanh được lặp mãi mãi, và gọi hàm lặp x(t). Quãng của phân đoạn lặp xác định tần số cơ bản f0, mà f0=samplingRate/N, với N là số các mẫu trong quá trình thu thanh. Ví dụ như vậy, nếu ta đang sử dụng một tần số lấy mẫu 44100 mẫu /giây, và độ dài quá trình thu thanh là 1024 mẫu, thì tổng thời gian được thể hiện bởi quá trình thu thanh là 1024/44100=0.02322 giây, nên tần số cơ bản f0 sẽ là 1/0.02322=43.07 Hz. Nếu ta xử lý 1024 mẫu này với FFT, đầu ra sẽ là các hệ số sin và cosin (giả sử là ak và bk) và cho các tần số 43.07Hz, 2*43.07Hz, 3*43.07Hz, vv... Để kiểm tra lại rằng sự tính toán hoàn toàn chính xác, ta có thể phát sinh mọi sóng hình sin và cosin tại các tần số này, nhân chúng với các hệ số ak và bk tương ứng, cộng chúng lại với nhau, và ta sẽ nhận được lại quá trình thu thanh gốc. 1.2. FFT trong âm thanh số Đặt vấn đề Vấn đề chính cùng với FFT cho quá trình xử lý các âm thanh là các quá trình thu thanh số phải được làm vỡ thành các khúc (chunks) với độ dài mỗi khúc là n mẫu, trong đó n luôn phải là một số nguyên bội của 2. Đầu tiên, sẽ lấy FFT của một khối, xử lý mảng ra FFT (ví dụ như điền 0 vào mọi mẫu tần số bên ngoài một dẫy xác định các tần số), sau đó thực hiện biến đổi ngược FFT để nhận lại tín hiệu trong miền thời gian đã được lọc. Khi âm được làm vỡ thành từng khúc giống như vậy, và được sử lý với FFT, kết quả nhận được sau khi lọc sẽ có những sự gián đoạn mà chúng dẫn đến việc có tiếng lách cách trong âm nhận được tại mỗi đường bao của khúc. Ví dụ như, nếu quá trình thu thanh có tần số lấy mẫu là 44,100Hz, và các khối có kích thước là n=1024, thì sẽ có một tiếng lách cách có thể nhận rõ tại mỗi khoảng 1024/(44,100Hz)=0.0232 giây. Giải pháp Để giải quyết điều này, ta có thể xử lý theo cách sau: Giả sử rằng kích thước bộ nhớ đệm là n = 2N. Trong bước lặp đầu tiên, đọc n mẫu từ âm vào, thực hiện FFT, xử lý, và IFFT, sau giữ lại dữ liệu theo thời gian nhận được trong bộ nhớ đệm thứ 2. Sau đó dịch nửa thứ 2 của bộ nhớ đệm gốc sang nửa đầu (chú ý rằng n là luỹ thừa của 2 nên nó chia hết cho 2), và đọc n/2 mẫu vào nửa thứ 2 của bộ nhớ đệm. Sau đó thực hiện biến đổi FFT, xử lý, và IFFT. Bây giờ thực hiện một phép suy giảm tuyến tính trên nửa thứ 2 của bộ nhớ đệm cũ mà nó đã được ghi từ bộ ba (FFT, xử lý, và IFFT) đầu tiên bằng cách nhân mỗi mẫu với một giá trị thay đổi từ 1 (cho mẫu số n/2) tới 0 (cho mẫu số n-1). Thực hiện phép tăng tuyến tính trên nửa đầu của bộ nhớ đệm ra mới (đi một cách tuyến tính từ 0 tới 1), sau đó cộng 2 nửa lại với nhau để nhận được một đầu ra với sự chuyển tiếp mịn. Chú ý rằng, các vùng xung quanh mỗi điểm gián đoạn được xoá bỏ thực sự từ đầu ra, qua một mức âm lượng thích hợp được giữ nguyên. Kỹ thuật này làm việc rất tốt khi quá trình xử lý không làm nhiễu loạn thông tin về phase của phổ tần số. Ví dụ như, một bộ lọc thông dải (bandpass) sẽ hoạt động rất tốt, nhưng ta có thể bắt gặp sự méo âm với sự dịch chuyển về cường độ. 2. Cepstrum Đặc điểm của homomorphic là sự biến đổi đại số tuyến tính mà nhờ đó có thể tách hai tín hiệu không cộng nhờ thuật toán phi tuyến trên cơ sở lọc tuyến tính. Tuỳ theo kiểu tổ hợp, ta tách thành hai khái niệm: Homomorphic nhân: tách tích của hai dãy tín hiệu. Tách tích chập homomorphic: tách tích chập của hai tín hiệu. Tín hiệu vào x(n) là tích của hai dãy phức x1(n) và x2(n). Để có thể tách hai dãy tín hiệu này bằng toán tử tuyến tính, ta cần phải lấy log phức. Và: (2.11) sẽ cho hai thành phần thực và ảo: (2.12) (2.13) Nếu phổ của các dãy không trùm hoặc trùm ít thì ta có thể dùng bộ lọc tuyến tính để lọc một tín hiệu và chặn tín hiệu còn lại. Khi đó đầu ra của hệ thống tuyến tính là dãy phức chỉ chứa log phức của một tín hiệu. Như vậy, khi dùng toán tử ngược của log tự nhiên ta sẽ nhận được một thành phần tín hiệu. Do đó, ta có sơ đồ tính Cepstrum như sau: Hình 3.2: Sơ đồ tính Cepstrum trong âm thanh Chương 6 Phương pháp thiết kế 1. Khái quát chức năng Sau khi đã nghiên cứu, tìm hiểu về các khuôn dạng lưu trữ âm thanh cũng như các kỹ thuật xử lý tín hiệu số, ta tiến hành thiết kế và xây dựng chương trình. Và, với chủ đề "Xây dựng chương trình xử lý âm thanh số", ta có thể tách các chức năng của chương trình thành 2 phần khá riêng biệt: âm thanh và tín hiệu của âm thanh. Với âm thanh, ta xét tới các đặc trưng của các khuôn dạng lưu trữ dữ liệu, cách tạo một tệp âm thanh và một số thao tác chuyển đổi dưới dạng trực quan. Và để có thể phân tích, nhận dạng các âm thanh với các tham số đặc trưng như tần số, cường độ..., thì ta phải xét tới dạng của tín hiệu cũng như phổ tương ứng của dữ liệu âm thanh đó. Do đó, ta có mô phỏng các chức năng của chương trình như sau: Hình 4.1: Mô hình xử lý 2. Cơ chế thực hiện Do dữ liệu đầu vào của chương trình là các tệp âm thanh nên chức năng đầu tiên của chương trình là mở tệp và đọc dữ liệu. Tuy nhiên, do có rất nhiều khuôn dạng tệp lưu trữ âm thanh khác nhau nên khi mở một tệp âm thanh ta phải kiểm tra để xác định khuôn dạng của tệp để từ đó có phương thức đọc tệp tương ứng. Trong chương trình, ta xét tới 2 khuôn dạng: tệp *.Wav và tệp *.Voc. Nói chung, ta nên kiểm tra dạng tệp Voc trước bởi tệp Voc có 20 bits ký hiệu định vị ngay đầu tệp nên khả năng có sự giả mạo dạng tệp là rất thấp, do đó nhanh chóng xác định được lệnh rẽ nhánh tiếp theo. Sau khi xác định được dạng tệp, ta sẽ có phương thức đọc dữ liệu tương ứng. Sau các chức năng xử lý và biểu diễn kết quả, chương trình có thể kết thúc hay tiếp tục mở một tệp mới để phân tích. Hình 4.2: Cơ chế hoạt động của chương trình Chương 7 Thao tác với tệp âm thanh 1. Truy nhập tệp Wave Mô phỏng cấu trúc WaveHeader: WaveHeader=record case boolean of false:( rID:longint; { 'RIFF' } rLen:longint; { dLen+36 } wID:longint; { 'WAVE' } fID:longint; { 'fmt ' } fLen:longint; { 16 wFT:word; { FormatTag : 1:PCM } nC:word; { Chanel: 1-mono; 2-stereo } nSp:word; { NumSamplesPerSecond } nAB:word; { 0: AvegBytesPerSecond } nBA:word; { BlockAligne = nSp*un1 } Fs:word; { 0: FormatSpecific } un1:word; { BitsPerSample:1-PCM8bit;2-PCM16bit } un2:word; { cbSize: 8-PCM8bits; 16-PCM16bits } dID:longint; { 'data' } dLen:longint; {NumBytes of TotalSamples } ); true:(hb:array[0..43]of byte); end; Định dạng dữ liệu Sau khi đọc khúc header định dạng (khúc "fmt "), ta sẽ biết được dữ liệu âm thanh PCM biểu diễn dưới dạng nào (dữ liệu trong khúc "data"). Điều đầu tiên mà ta cần biết là kích thước của mỗi mẫu dữ liệu. Giá trị này được xác định qua tham số un2 (nBitsPerSample) từ header định dạng. Nếu un2 nhỏ hơn hay bằng 8 bits, thì mỗi mẫu PCM sẽ là một byte, và sẽ xắp xếp theo các giá trị từ 0 tới 255. Tuy nhiên, nếu un2 là giá trị trong khoảng từ 9 tới 16 thì mỗi mẫu PCM sẽ chiếm 2 bytes, và giá trị nằm trong khoảng -32768 tới +32767 (và đây thực sự là một mâu thuẫn khi ta sử dụng dữ liệu dạng biểu diễn "unsigned" trong một khuôn dạng, và trong khuôn dạng khác lại là "signed"). Số kênh truyền Sau đó, ta cần biết số kênh truyền (numChannels - nC). Nếu chỉ là một kênh, thì dữ liệu PCM sẽ được xắp xếp theo thứ tự thời gian: mẫu đầu tiên sẽ ở đầu tệp, và mẫu cuối cùng định vị ở cuối tệp. Nếu có nhiều hơn một kênh, thì mọi mẫu cho chỉ số đầu tiên được đưa trước, quá trình lặp lại qua các kênh. Sau đó đưa ra mẫu tiếp theo, và tiếp tục lặp lại qua các kênh. Một cách mô phỏng, với số kênh tuỳ ý: i:= 0; While i < numSamples do Begin For c:= 0 to numChannels - 1 do {...xử lý Sample[i+c]...}; i:= i + numChanels; End; Cần chú ý rằng, nếu có 2 kênh thì giá trị đầu tiên trong mỗi cặp là của kênh trái, và giá trị thứ hai là của kênh phải. Do đó, ta có thể coi kênh trái như Channel 0, và kênh phải như Channel 1. Tần số lấy mẫu Và một định lượng quan trọng khác là tần số lấy mẫu (số mẫu/giây hay Hz - nSp: NumSamplesPerSecond). Tham số này thực sự quan trọng khi ta cần xử lý âm dựa trên các giá trị thời gian thực biểu diễn theo giây, hay cần thể hiện thông tin về tần số theo Hz (như khi sử dụng FFT). Do đó, cần lưu giá trị tần số lấy mẫu này vào một biến (Fs) để có thể áp dụng cho quá trình phân tích tín hiệu sau đó. 2. Truy nhập tệp Voc Do đặc tính của tệp Voc là gồm các khối nên cần phải đọc lần lượt cho tới khi hết tệp hay gặp khối dữ liệu. Ngoại trừ khối dạng 0 chỉ chứa một byte đơn giá trị 0 đánh dấu cuối tệp, khuôn dạng các khối khác đều gồm một header kích thước 4 bytes và tiếp theo là dữ liệu. Do đó, ta có cấu trúc chung: Khuôn dạng khối VocBlockFormat = record header: VocBlockHeader; data: VocData; End; Trong đó, dạng VocBlockHeader là cấu trúc chung cho mọi khối. VocBlockHeader = record blockType:byte; {1 byte định danh dạng khối } dataLen: longint; {3 byte xác định độ dài dữ liệu } End; Riêng phần VocData là khác nhau. Tuy nhiên ta chỉ cần xét các khối dạng 1, dạng 8 và dạng 9. Bởi vì đây là các khối chứa thông tin về khuôn dạng lưu trữ dữ liệu. Khối dạng 1: VocData1 = record SamRateCode :byte; {1 byte mã tần số lấy mẫu} DataCompresCode :byte; {1 byte mã phương thức nén dữ liệu} End; Trong đó, tần số

Các file đính kèm theo tài liệu này:

  • docDigitalSound.doc