Trong bước này, các giá trị nhị phân biểu diễn một độ chói cụ thể.. Biểu vì biến đổi ngược của lượng tử hoá là biến đổi từ nhiều vào một, nên quá trình này không thể tiến hành một cách t
Trang 1thành N miền và gán cho mỗi miền một giá trị nhị phân như trong hình
13.14 Sự biểu diễn này không có ý nghĩa gì về mặt vật lý, và chức năng của sự biểu diễn này, như chúng ta muốn, chỉ dùng trong lĩnh vực xử lý
tín hiệu số Tất cả các tín hiệu số này gọi là điều mã xung (Pulse Code
Modulated - PCM) Để có thể thực sự thấy giá trị các mức xám chúng ta cần lượng tử hoá ngược Trong bước này, các giá trị nhị phân biểu diễn một độ chói cụ thể Các bước thực sự của quá trình này biểu diễn trong hình 13.15 Trong lĩnh vực tương tự và lĩnh vực số quá trình này gọi là
chuyển đổi từ tương tự sang số (A/D) và chuyển đổi từ số sang tương tự
(D/A)
Trong các ứng dụng như trường hợp biến đổi cosin 2-D thì có một chút khác biệt Cái mà chúng ta cần làm trong trường hợp này là biến đổi từ một tập hợp các dấu phẩy động sang một tập hợp các bít nhị phân và ngược lại Biểu vì biến đổi ngược của lượng tử hoá là biến đổi từ nhiều vào một, nên quá trình này không thể tiến hành một cách thông thường
được May mắn thay, có một số phương pháp để lượng tử hoá và lượng tử hoá ngược Chúng ta sẽ nghiên cứu các phương pháp này ở phần dưới
đây
dN
dN-1
d5
d4
d3
d2
d1
d0
N-1 N-2
4
3
2
1
0
11111111
11111110
00000100
00000011
00000010
00000001
00000000
YU
YL
Dạng thập phân Dạng nhị phân
di { i= 0, ,1} là các mức chia
Trang 2Hình 13.14 Lượng tử hoá
13.5.1 Lượng tử hoá đồng đều
Đây là dạng đơn giản nhất của lượng tử hoá Trong dạng lượng tử hoá
này, khoảng (y u - y L ) được chia thành N khoảng cách đều nhau (xem
trong hình 13.14) Các giá trị từ d 0 đến d N được gọi là các mức chia Các mức lượng tử biểu diễn giá trị thực của các mức chia trong khoảng từ d i
đến d i+1 dưới dạng số nhị phân bằng i
Vì vậy, nếu như d i+1 < y d i thì giá trị của lượng tử đầu ra = i
Mức lượng tử đầu ra có thể biểu diễn theo công thức:
y y
y y i
L v
ở đây dấu có nghĩa là làm tròn thành số nguyên gần nhất
Lượng tử hoá ngược dùng một bảng biến đổi ngược giữa giá trị lượng
tử i và biến đổi ngược của nó r i
2 1
i i
i
d d r
Tuy nhiên lượng tử hoá đồng đều không quan tâm đến khả năng xảy ra của sự kiện với các giá trị được đưa ra Tổng quát, quá trình lượng tử hoá này áp dụng cho trường hợp tất cả các mức có khả năng xuất hiện bằng nhau Điều này, trong hầu hết các trường hợp là không đúng Dễ nhận thấy là các mức lượng tử hoá tập trung nhiều nhất vào miền mà khả năng xuất hiện của các mức xám nhiều nhất Điều này dẫn chúng ta đến phương pháp thiết kế lượng tử hoá dưới đây
Hình 13.15 Lượng tử hoá ngược
Tín hiệu
ánh sáng
Tín hiệu tương tự
t
t
Lượng
tử hoá
ngược hay biến đổi
số sang
Bộ lọc thông thấp
Tín hiệu
dạng nhị
phân
Mức
được tái thiết
Trang 313.5.2 Lượng tử hoá không đồng đều
Trong phần này chúng ta sẽ xem xét phương pháp lượng tử hoá không
đồng đều tối ưu nhất trong hệ thống PCM Các nghiên cứu cho phương pháp này đã được Panter và Dite đưa ra trong một cuốn sách xuất bản vào năm 1949 Trong cuốn sách này họ đã đưa giải thuật cho lượng tử hoá không đồng đều Họ đưa ra một phương pháp xấp xỉ tối ưu cho lượng tử hoá không đồng đều Giải thuật này sẽ không đúng cho các trường hợp quá trình lượng tử hoá có quá ít mức chia Tuy nhiên các giải thuật này
được phát triển một các trọn vẹn trong một báo cáo chưa được xuất bản của Lloyd vào năm 1957 và được Max kiểm nghiệm vào năm 1960 Một phương pháp lượng tử hoá kết hợp cả hai phương pháp của Lloyd và Max thường được gọi là phương pháp lượng tử hoá Lloyd-Max Trong phần báo cáo xuất bản sau đó của Lloyd xuất bản vào năm 1982 đã cho thấy
có rất nhiều ứng dụng rất thú vị của phương pháp này Bản báo cáo này
có hai phương pháp thiết kế, một phương pháp trong đó giống phương pháp của Max Phương pháp này gọi là phương pháp II Phương pháp I tỏ
ra có nhiều ứng dụng và dễ tính toán hơn phương pháp II Cả hai phương pháp thiết kế này đều được trình bày ở phần dưới đây
Nếu chúng ta coi rằng các mức lượng tử hoá được cho bởi
d i , i = 0 N
(xem hình 13.16) và các mức khôi phục cho bởi
r i , i = 0 N
và giá trị đo của tất cả các mức này cho bởi:
N k
d
d k
k
k
dy y p r y E
0
2 1
) ( )
ở đây y là tín hiệu đầu vào còn p(y) là khả năng xuất hiện của y
Trang 4Hình 13.16 Các mức lấy mẫu và khôi phục
Hình 13.17 Các xử lý lấy mẫu và khôi phục
Hình 13.17 cung cấp sơ đồ khối của quá trình lượng tử hoá và lượng tử
hoá ngược Tín hiệu vào y(t) phải được coi là đã biết khả năng xuất hiện
Vấn đề đặt ra là phải xác định các mức lấy mẫu và các mức khôi phục sao cho méo tín hiệu là nhỏ nhất
Viết lại biểu thức (13.49 ):
i
i
d
d
i d
d
dy y p r y dy
y p r y E
1 1
0
) ( ) (
) ( )
dN
dN-1
d5
d4
d3
d2
d1
d0
yL
yu
y
mẫu i Lượng tử hoá Lượng tử hoá
ngược
i
N-1
3
2
1
0
i ri
r0 LUT cho lượng
tử hoá ngược
Trang 5( ) ( ) ( ) ( )
N
N d
r
Vi phân (13.50) theo d I và cho biểu thức này bằng không chúng ta
được
d i r i r i1
i = 1,2,3, ,N
Lấy vi phân (13.50) theo r i chúng ta được
1
) ( ) ( 2
i
i
d
d
i i
dy y p r y r
E
1 1
) (
) (
i
i
i
i
d
d
d
d i
dy y p
dy y yp
i = 0, 1, , N - 1
Hình 13.18 Phương pháp Newton-Raphson cho tính các biểu thức trong
ngoặc
Biểu thức (13.50) và biểu thức (13.51) đưa ra phương pháp xác định các mức lấy mẫu và các mức khôi phục dùng cho cả phương pháp của Lloyd-Max hoặc là phương pháp Lloyd
Phương pháp Lloyd-Max Lloyd và Max đã phát triển độc lập thuật
toán để giải quyết biểu thức (13.50) và (13.51) Các chi tiết của thuật toán này vẫn chưa được cung cấp Trong phần này tôi sẽ cung cấp cho bạn một thuật toán dựa trên thuật toán Lloyd-Max nhưng có các chi tiết
Trang 6cụ thể hơn Tôi cũng sẽ cung cấp cho bạn phần mềm thiết kế N mức lấy mẫu và khôi phục
Thuật toán này gồm các bước sau:
1 Chọn một giá trị cho r 0 d 0 và d N được coi là đã biết
2 Cho i = 1,2, ,N - 1
a Tính d i từ
i
i
i
i i
d
d
d
d i
dy y p
dy y yp r
1
1
) (
) ( 1
b Tính r i từ
r i 2d i r i1
3 Tính
N
N
N
N
d
d
d
d
dy y p
dy y yp r
1
1
) (
) ( /
4 Nếu r N-1 r / , thay đổi lại r 0 và lặp lại các bước từ bước 2 cho đến bước 4
Bây giờ tôi sẽ cung cấp cho bạn các chi tiết cần thiết để tạo ra thuật toán trên
Chi tiết cho việc tính d i trong bước 2a của thuật toán Lloyd-Max d i có thể tính theo hàm sau đây:
i
i
i
i
d
d
d
d i i
dy y p
dy y yp r
d f
1
1
) (
) ( )
Có thể rút ra biểu thức gốc theo công thức lặp Newton-Raphon được cho bởi:
Trang 7) (
) ( /
1
l i
l i l
i
l i
d f
d f d
ở đây l là số lần lặp và f /
(d i ) là đạo hàm của f(d i ) theo d i cho theo công thức:
i
i
i
i i
i
d
d
d
d i d
d
i i
dy y p
dy y yp d
dy y p
d p d
f
1 1
1
) (
) (
) (
) ( )
(
d 0 i là giá trị ban đầu Phép lặp diễn ra cho đến khi f d( ) i
Giá trị ban đầu cho d 1 là d 0 + , cho d 2 là d 1 + , , ở đây là một giá
trị nhỏ Giá trị gốc của f(d i ) có thể tính theo dùng phương pháp nửa lặp
(bisection) Ưu điểm của phương pháp Newton-Raphson là khả năng hội
tụ nhanh Nhược điểm là đạo hàm của một hàm thường có giá trị rất nhỏ
và dễ dẫn đến giá trị zero gây nên sự không ổn định của các số
Các chi tiết cho việc thay đổi r 0 Giá trị r 0 có thể thay đổi lại nếu chúng
ta nhận thấy rằng giá trị gốc của hàm:
Giá trị gốc này có thể rút ra dùng các giả thiết của Newton-Raphson theo:
g r
l l
0 1 0
0 0
( )
( )
Đạo hàm của g(r 0 ) có thể rất khó khăn cho việc phân tích Trong
trường hợp này cần có một công cụ tính toán khác Chúng ta có thể thay thế đạo hàm bằng một giá trị hằng số có cùng dấu như biểu thức trong dấu ngoặc (xem hình 13.8) Trong trường hợp này thì tích phân lâu hội tụ hơn
Tiếp theo là một chương trình cho tính các mức lượng tử hoá theo phương pháp Lloyd-Max Tích phân được đưa ra dùng phương pháp tích phân Romberg bởi vì nó chính xác hơn phương pháp tích phân Simpson Chương trình cho phép bạn thiết kế lượng tử hoá đồng đều, Gauss hoặc là Laplace
2
2 2
2
1 )
y
e y
Trang 8Laplace p y( ) e y
2
2
Đồng dạng:
0
1
|<=
y
| 1 ) (
lại còn hợp trường các
y p
Chương trình này có thể thay kiểm tra trên cả ba loại phân bố (với = 1) với 6 bit cụ thể là 64 mức lượng tử hoá Bạn cần chú ý khi bạn chạy chương trình này bạn cần cho số của lựa chọn Lựa chọn đầu tiên là số bit bạn muốn xây dựng cho mức lượng tử, lựa chọn thứ hai là lựa chọn về các mức phân bố (phân bố Gauss, phân bố đồng đều, hoặc phân bố Laplace), và thứ ba cũng là lựa chọn cuối cùng là lựa chon trong khi tính
biểu thức trong ngoặc của g(r 0 ) Lựa chọn của g(r 0 ) có thể là lựa chọn cho
một số, một giá trị hoặc là một giá trị tăng dần Lý do của sự lựa chọn này là kết quả của phương pháp tính toán có thể là một số không thể tính
được, ví dụ khi ta chia cho một số quá nhỏ Qua kinh nghiệm tôi nhận thấy rằng phân bố Gauss và phân bố đồng đều thường cho kết quả tính toán rất tốt Còn cho phân bố Laplace, khi dùng tăng giá trị của biểu thức trong ngoặc sẽ không gặp một khó khăn nào việc tạo mã 6 bit
Chương trình 13.9 MAXQ1.C Chương trình cho tính các mức lượng tử Lloyd-Max
/*Program 13.9 "MAXQI.C" Program for the Lloyd-Max quantizer.*/
/* Program for designing the Lloyd-Max quantizer for Gauss, uniform or Laplace distribution.*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <alloc.h>
#include <conio.h>
double decision_level(double , double);
double f1(double);
double f2(double);
double p(double);
Trang 9double Romberg(double, double, double
(*)(double));
char ch;
void main()
{
double *r,*d,r1,delta,alpha;
int i,m,N,k,xt,yt;
double der,rt,deltal, delta2;
char ch1,file_name[16];
FILE *fptr;
clrscr();
printf("Enter number of bits - >");
scanf("%d",&m);
N=1<<m;
r=(double *)malloc((N+1)*sizeof(double));
d=(double *)malloc((N+1)*sizeof(double));
printf("Enter choice of distribution:");
printf("\n 1 Gauss.");
printf("\n 2 Uniform.");
printf("\n 3 Laplace >(1,2 or 3): ");
while(((ch=getch())!='1')&&(ch!='2')&&(ch!='3')); putch(ch);
switch(ch)
{
case '1':
r[0]=-5.0; d[0]=-20.0;
break;
case '2':
r[0]=-0.98; d[0]=-1.0;
break;
case '3':
r[0]=-6.0; d[0]=-100.0;
if(m==6) r[0]=-8.0;
}
printf("\n\n The program uses Newton-Raphson's method");
printf("\n to compute the proper value of r[01 You have");
Trang 10printf("\n a choice between using calculated values, a");
printf("\n fixed value or decreasing values for the ");
printf("\n derivatives at every update or
calculated ");
printf("\n values Always pick the first choice unless ");
printf("\n you encounter numerical problems."); xt=wherex();
yt=wherey();
gotoxy(1,21);
printf("Recommendations: Guassian or Uniform select I or 2.\n");
printf(" Laplace select 3."); gotoxy(xt,yt);
printf("\n Enter choice:");
error function.");
printf("\n 2 Fixed value.");
printf("\n 3 Decreasing derivative. >"); while(((ch1=getch())!='1')&&(ch1!='2')&&(ch1!='3' ));
putch(ch1);
gotoxy(1,21);
delline();
delline();
delta=20.0;
k=0;
xt=wherex(); yt=wherey();
gotoxy(70,25);
textattr(WHITE+(GREEN<<4)+BLINK);
cputs("WAIT");
while(fabs(delta)>=1.e-7)
{
k++;
if(k>=1000) break;
/* Computing the derivative of the function:
f(r[0])=r[N-1]-r1, numerically */
switch(ch1)
{
Trang 11case '1':
rt=r[0]; r[0]=r[0]+0.001;
for(i=1;i<N;i++)
{
d[i]=decision_level(d[i-1],r[i-1]);
r[i]=2.0*d[i]-r[i-1];
}
r1=Romberg(d[N-1],-d[0],f1)/Romberg(d[N-1],-d[0],f2);
deltal=r[N-1]-r1;
r[0]=rt; r[0]=r[0]-0.001;
for(i=1;i<N;i++)
{
d[i]=decision_level(d[i-1],r[i-1]);
r[i]=2.0*d[i]-r[i-1];
}
r1=Romberg(d[N-1],-d[0],f1)/Romberg(d[N-1],-d[0],f2);
delta2=r[N-1]-r1;
r[0]=rt;
der=(deltal-delta2)/0.002;
break;
case '2':
der=5.0;
if(m==6) der=10.0;
break;
case '3':
if(k==1) der=5.0;
else if((k%5)==0) der/=2.0;
break;
}
/*Computing the values of dEil and r[i] */
for(i=1;i<N;i++)
{
d[i]=decision_level(d[i-1],r[i-1]);
r[i]=2.0*d[i]-r[i-1];
}
r1=Romberg(d[N-1],-d[0],f1)/Romberg(d[N-1],-d[0],f2);
delta=(r[N-1]-r1);
Trang 12gotoxy(1,18);
printf("\n %d derivative=%f error=%f ",
k,der,delta);
if(fabs(delta)>=500.0)
{
printf("\n A numerical problem was
encountered.");
printf("\n Restart problem with a different choice.");
exit(1);
}
r[0]-delta/der;
}
gotoxy(70,25);
textattr(WHITE+(BLACK<<4));
cputs(" ");
gotoxy(xt,yt+2);
switch(ch)
{
case '1':
case '3':
printf("\n\n -%c %9.6f ",(char)236,r[0]); break;
case '2':
printf("\n\n %9.6f %9.6f ",d[0],r[0]);
}
for(i=1;i<N;i++)
printf("\n %9.6f %9.6f ",d[i],r[i]);
switch(ch)
{
case '1':
case '3':
printf("\n +%c",(char)236);
break;
case '2':
printf("\n %9.6f ",-d[0]);
}
printf("\nEnter file name for storing
quantizer >");
scanf("%s",file_name);
fptr=fopen(file_name,"w");