我正在开发一个程序,我必须在 MATLAB 中量化具有 16 个量化级别的正弦波
我开发了一个 for 循环,它应该正确量化这些值,它对正弦波的正值起作用,但随后为信号的负值显示所有零
这是我开发的代码:
sig1 = [0 0.6428 0.9848 0.8660 0.3420 -0.3420 -0.8660 -0.9848 -0.6428 -0.0000]
b = 4;
N = 10;
yMax = 1.4088;
yMin = -1.3660;
for i = 1:N
value = ((yMax - yMin)/(2^b));
halfstep = value / 2;
%Calculating quantization levels
value0 = value * 0;
value1 = value * 1;
value2 = value * 2;
value3 = value * 3;
value4 = value * 4;
value5 = value * 5;
value6 = value * 6;
value7 = value * 7;
value8 = value * -1;
value9 = value * -2;
value10 = value * -3;
value11 = value * -4;
value12 = value * -5;
value13 = value * -6;
value14 = value * -7;
value15 = value * -8;
%Quantizing signal1
if value15 < sig1(i) < value14
if sig1(i) < value15 + halfstep
qsig1(i) = -8;
else
qsig1(i) = -7;
end
elseif value14 < sig1(i) < value13
if sig1(i) < value14 + halfstep
qsig1(i) = -7;
else
qsig1(i) = -6;
end
elseif value13 < sig1(i) < value12
if sig1(i) < value13 + halfstep
qsig1(i) = -6;
else
qsig1(i) = -5;
end
elseif value12 < sig1(i) < value11
if sig1(i) < value12 + halfstep
qsig1(i) = -5;
else
qsig1(i) = -4;
end
elseif value11 < sig1(i) < value10
if sig1(i) < value11 + halfstep
qsig1(i) = -4;
else
qsig1(i) = -3;
end
elseif value10 < sig1(i) < value9
if sig1(i) < value10 + halfstep
qsig1(i) = -3;
else
qsig1(i) = -2;
end
elseif value9 < sig1(i) < value8
if sig1(i) < value9 + halfstep
qsig1(i) = -2;
else
qsig1(i) = -1;
end
elseif value8 < sig1(i) < value0
if sig1(i) < value8 + halfstep
qsig1(i) = -1;
else
qsig1(i) = 0;
end
elseif value0 < sig1(i) < value1
if sig1(i) < value0 + halfstep
qsig1(i) = 0;
else
qsig1(i) = 1;
end
elseif value1 < sig1(i) < value2
if sig1(i) < value1 + halfstep
qsig1(i) = 1;
else
qsig1(i) = 2;
end
elseif value2 < sig1(i) < value3
if sig1(i) < value2 + halfstep
qsig1(i) = 2;
else
qsig1(i) = 3;
end
elseif value3 < sig1(i) < value4
if sig1(i) < value3 + halfstep
qsig1(i) = 3;
else
qsig1(i) = 4;
end
elseif value4 < sig1(i) < value5
if sig1(i) < value4 + halfstep
qsig1(i) = 4;
else
qsig1(i) = 5;
end
elseif value5 < sig1(i) < value6
if sig1(i) < value5 + halfstep
qsig1(i) = 5;
else
qsig1(i) = 6;
end
elseif value6 < sig1(i) < value7
if sig1(i) < value6 + halfstep
qsig1(i) = 6;
else
qsig1(i) = 7;
end
elseif sig1(i) < value15
qsig1(i) = 0;
end
end
sig1
qsig1
如果有人能帮助我弄清楚为什么 sig1 的负值在 qsig1 中全部为零,我将不胜感激!
谢谢!
经过更多的工作,我发现 MATLAB 不能像我想象的那样进行两次比较,所以我使用 和 语句来达到预期的结果。
我使用的代码:
if sig1(i) < value15
qsig1(i) = -8;
elseif sig1(i) < value14 && sig1(i) > value15
if value15 < sig1(i) && sig1(i) < (value15 + halfstep)
qsig1(i) = -8;
else
qsig1(i) = -7;
end
elseif sig1(i) < value13 && sig1(i) > value14
if value14 < sig1(i) && sig1(i) < (value14 + halfstep)
qsig1(i) = -7;
else
qsig1(i) = -6;
end
elseif sig1(i) < value12 && sig1(i) > value13
if value13 < sig1(i) && sig1(i) < (value13 + halfstep)
qsig1(i) = -6;
else
qsig1(i) = -5;
end
elseif sig1(i) < value11 && sig1(i) > value12
if value12 < sig1(i) && sig1(i) < (value12 + halfstep)
qsig1(i) = -5;
else
qsig1(i) = -4;
end
elseif sig1(i) < value10 && sig1(i) > value11
if value11 < sig1(i) && sig1(i) < (value11 + halfstep)
qsig1(i) = -4;
else
qsig1(i) = -3;
end
elseif sig1(i) < value9 && sig1(i) > value10
if value10 < sig1(i) && sig1(i) < (value10 + halfstep)
qsig1(i) = -3;
else
qsig1(i) = -2;
end
elseif sig1(i) < value8 && sig1(i) > value9
if value9 < sig1(i) && sig1(i) < (value9 + halfstep)
qsig1(i) = -2;
else
qsig1(i) = -1;
end
elseif sig1(i) < value0 && sig1(i) > value8
if value8 < sig1(i) && sig1(i) < (value8 + halfstep)
qsig1(i) = -1;
else
qsig1(i) = 0;
end
elseif sig1(i) < value1 && sig1(i) > value0
if value0 < sig1(i) && sig1(i) < (value0 + halfstep)
qsig1(i) = 0;
else
qsig1(i) = 1;
end
elseif sig1(i) < value2 && sig1(i) > value1
if value1 < sig1(i) && sig1(i) < (value1 + halfstep)
qsig1(i) = 1;
else
qsig1(i) = 2;
end
elseif sig1(i) < value3 && sig1(i) > value2
if value2 < sig1(i) && sig1(i) < (value2 + halfstep)
qsig1(i) = 2;
else
qsig1(i) = 3;
end
elseif sig1(i) < value4 && sig1(i) > value3
if value3 < sig1(i) && sig1(i) < (value3 + halfstep)
qsig1(i) = 3;
else
qsig1(i) = 4;
end
elseif sig1(i) < value5 && sig1(i) > value4
if value4 < sig1(i) && sig1(i) < (value4 + halfstep)
qsig1(i) = 4;
else
qsig1(i) = 5;
end
elseif sig1(i) < value6 && sig1(i) > value5
if value5 < sig1(i) && sig1(i) < (value5 + halfstep)
qsig1(i) = 5;
else
qsig1(i) = 6;
end
elseif sig1(i) < value7 && sig1(i) > value6
if value6 < sig1(i) && sig1(i) < (value6 + halfstep)
qsig1(i) = 6;
else
qsig1(i) = 7;
end
elseif value7 < sig1(i)
qsig1(i) = 7;
end
你的决定过于复杂。尝试使用函数轮:
sig1 = [0 0.6428 0.9848 0.8660 0.3420 -0.3420 -0.8660 -0.9848 -0.6428 -0.0000]
b = 4;
N = 10;
yMax = 1.4088;
yMin = -1.3660;
value = ((yMax - yMin)/(2^b));
gsig1=round(sig1./value);