# Quantization of a standard Cosine signal

18 views (last 30 days)
Andre Gates on 25 Mar 2021
Commented: Robert Brown on 5 Apr 2021
Hello, could someone please explain the function of the folllowing ( Z1 to Z4 )lines in the MATLAB script along with the summary of what the code does. A slightly detailed explanation is much appreciated.
close all; clear all; clc
A = 4; fm = 1; M = 20;
t = 0:(1/(M*fm)):1;
xs = A*cos(2*pi*fm*t); %sampled cosine signal
%Quantization
L = 10;
Length_xs = length(xs);
xq = zeros(1, Length_xs);
L_level = zeros(1, Length_xs);
for loop = 1:Length_xs
for index = 1:L
if (A-index*(2*A)/L <=xs(loop)) && (A-(index-1)*(2*A)/L > xs(loop))
xq(loop) = A - index*(2*A)/L + A/L;
L_level(loop) = L-(index-1); %-------------------------------------Z1
end
end
if xs(loop) == A
xq(loop) = A - A/L;
L_level(loop) = L; %-----------------------------------------Z2
end
end
%xq is the quantized cosine signal
NN = ceil(log2(L)); %---------------------------------------------Z3
encoded = dec2bin(L_level, NN) %-----------------------------------Z4
plot(t, xs, 'r-')
hold on
plot(t, xq, 'bo')
xlabel('time')
ylabel('signals')
legend('Original signal','quantized signal')

Robert Brown on 30 Mar 2021
Edited: John D'Errico on 4 Apr 2021
%% Description of Z1
First, we recognize that loop is equal to sample number.
So L_level(loop) is the quantization level of the current sample.
Because MATLAB indexes from 1 to n, instead of 0 to n-1, we would never
reach level 10 quantization unless we subtract 1 from the index.
The level L=10-(index-1), for index=1 = 10.
Also, they are inverting the levels, bacause the test is "amplitude-index...
In other words, the first index is a test of Level 10, so index=1 gives
Level=10-(index-1) = 10-(1-1) = Level_10.
To continue, index 10 = (Level=10)-(index-1) = (Level=10) - (index=10 - 1)
= 10 - (10-1) = 10-9 = 1.
Therefore, indexes 1:10 test for Levels 10:1 (this could have been programmed
better, without this inverse relationship)
%% Description of Z2
Because the index loop (for index = 1:L) tests for A-index being less than xs,
and also tests whether A-(index-1) is greater than xs, it won't catch the
case where A-(index=1 -1) = A-0 = A is equal to the max amplitude A.
Therefore, the code developer followed up with a test of.... if xs(loop) = A...
then xq(loop) = A - A/L = 4 - 4/10 = 3.6
Note that this test is unnecessary if the code developer changes the second
half of the first test to be (A-(index-1)*(2*A)/L >= xs(loop)
Maybe to be clear, the L_levels are... Level 10 >= 3.2(to 4), Level 9 >=2.4(to 3.5999999...),
Level 8 >= 1.6 to 2.4-, Level 7 >= 0.8.., Level 6 >= 0.0-0.799999999, Level 5 >=
-0.8(to 0-), Level 4 >= -1.6(to just under -0.8), Level 3 >= -2.4..., Level
2 >= -3.2..., Level 1 >= -4 to just under -3.2)
Note that the L_levels are not the final answer. Eventually the final
answer will be the midpoint of the L_levels for each bin.... So Level 10 =
3.2 to 4.0, and will eventually be encoded 3.6, the midpoint of the band.
%% Description of Z3
Because we have 10 levels, and want to express them in binary...
log2 of a number tells what power of 2 = 10
NN = ceil(log2(L))
NN = ceil(log2(10))
since log2(10) = 3.3219
ceil(log2(10) = ceil(3.3219), and ceil rounds up to next integer
so NN = 4(bits needed) when this statement is finished,
implying 4 bits to hold 1:10 in binary representation.
Level Binary(encoded)
1 '0001
2 '0010
3 '0011
4 '0100
5 '0101
6 '0110
7 '0111
8 '1000
9 '1001
10 '1010
%% Description of Z4
The dec2bin function converts the base_10 level numbers to base_2 (binary).
In addition, since NN was specified, we will fully pupulate 4 bit binary
text representatons of the 10 levels.
'encoded' contains the binary representation of the level at each of the 21
signal samples.
Level Binary(encoded)
1 '0001
2 '0010
3 '0011
4 '0100
5 '0101
6 '0110
7 '0111
8 '1000
9 '1001
10 '1010
Robert Brown on 5 Apr 2021
Thanks for the edit pencil advice...
I first wrote the comments into a MATLAB code copy of the example, hence the comment % marks in the answers. They did nothing here, but they did something (commented those answer comments) in the code. I'm not ADDING % comment markers to my answers here, they were already added when I was writing the answers into the code while debugging this code question. When I extracted the answers from the code and pasted here, the % markers tagged along...
You MVP's sure are particular about your answers. Perhaps I'll just leave the answering to the MVPs. I don't seem to be getting any thanks for my attempts, just complaints that my answers aren't up to "standards". Disappointing...

### Categories

Find more on Waveform Generation in Help Center and File Exchange

R2018a

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by