16 Nov 2010

ADPCM

ADPCM


clc;clear all;close all;

% Getting Input wavefile
x=wavread('bluetooth_input.wav');

% Encoding
y=adpcm_encoder(x);
disp('Length of Encoded wavefile');disp(length(y));

% Decoding
z=adpcm_decoder(y);
disp('Length of Decoded wavefile');disp(length(z));

qerror=0;
for n=1:length(x)
e(n)=x(n)-z(n);
qerror=qerror+e(n);
end

error_rate=10*log(qerror/length(x));
disp('Error rate:');disp(error_rate);

% Plotting
subplot(411);plot(x);title('Input Wavefile');
subplot(412);plot(y);title('Encoded Wavefile');
subplot(413);plot(z);title('Decoded Wavefile');
subplot(414);plot(e);title('Error Signal');


function adpcm_y = adpcm_encoder(raw_y)

IndexTable = [-1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8];

StepSizeTable = [7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767];

prevsample = 0;
previndex = 1;

Ns = length(raw_y);
n = 1;

raw_y = 32767 * raw_y; % 16-bit operation

while (n <= Ns) predsample = prevsample; index = previndex; step = StepSizeTable(index); diff = raw_y(n) - predsample; if (diff >= 0)
code = 0;
else
code = 8;
diff = -diff;
end

tempstep = step;
if (diff >= tempstep)
code = bitor(code, 4);
diff = diff - tempstep;
end
tempstep = bitshift(tempstep, -1);
if (diff >= tempstep)
code = bitor(code, 2);
diff = diff - tempstep;
end
tempstep = bitshift(tempstep, -1);
if (diff >= tempstep)
code = bitor(code, 1);
end

diffq = bitshift(step, -3);
if (bitand(code, 4))
diffq = diffq + step;
end
if (bitand(code, 2))
diffq = diffq + bitshift(step, -1);
end
if (bitand(code, 1))
diffq = diffq + bitshift(step, -2);
end

if (bitand(code, 8))
predsample = predsample - diffq;
else
predsample = predsample + diffq;
end

if (predsample > 32767)
predsample = 32767;
elseif (predsample < -32768) predsample = -32768; end index = index + IndexTable(code+1); if (index < index =" 1;"> 89)
index = 89;
end

prevsample = predsample;
previndex = index;

adpcm_y(n) = bitand(code, 15);
n = n + 1;
end

function raw_y = adpcm_decoder(adpcm_y)

IndexTable = [-1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8];

StepSizeTable = [7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767];

prevsample = 0;
previndex = 1;

Ns = length(adpcm_y);
n = 1;

while (n <= Ns) predsample = prevsample; index = previndex; step = StepSizeTable(index); code = adpcm_y(n); diffq = bitshift(step, -3); if (bitand(code, 4)) diffq = diffq + step; end if (bitand(code, 2)) diffq = diffq + bitshift(step, -1); end if (bitand(code, 1)) diffq = diffq + bitshift(step, -2); end if (bitand(code, 8)) predsample = predsample - diffq; else predsample = predsample + diffq; end if (predsample > 32767)
predsample = 32767;
elseif (predsample < -32768) predsample = -32768; end index = index + IndexTable(code+1); if (index < index =" 1;"> 89)
index = 89;
end

prevsample = predsample;
previndex = index;

raw_y(n) = predsample / 32767;
n = n + 1;
end

Quadrature Phase Shift Keying

Quadrature Phase Shift Keying


clc;clear all;close all;


% Getting Input binary bits and frequency

g=[1 0 1 1 0 0 0 1];

f=10;;


t=0:2*pi/99:2*pi;

binary=[];

carrier1=[];carrier2=[];

mult=[];

c=cos(f*t);s=sin(f*t);


% QPSK algorithm

for n=1:2:length(g)

if g(n)==0 && g(n+1)==1

x=[zeros(1,50) ones(1,50)];

y=ones(1,100);

end

if g(n)==0 && g(n+1)==0

x=[zeros(1,50) zeros(1,50)];

y=-ones(1,100);

end

if g(n)==1 && g(n+1)==0

x=[ones(1,50) zeros(1,50)];

y=-ones(1,100);

end

if g(n)==1 && g(n+1)==1

x=[ones(1,50) ones(1,50)];

y=ones(1,100);

end

mult=[mult y];

carrier1=[carrier1 c];

carrier2=[carrier2 s];

binary=[binary x];

end


bpsk=mult.*carrier1+mult.*carrier2;


% Plotting

subplot(211);plot(binary);grid on;

title('Input Binary Signal');

axis([0 50*length(g) -1.5 1.5]);

subplot(2,1,2);plot(bpsk);grid on;

title('QPSK Modulated Signal');

axis([0 50*length(g) -1.5 1.5]);


% Calculation of BER

N=10^5;

Es_No_db=[-3:20];

iphat=zeros(1,N);

for ii=1:length(Es_No_db)

ip=(2*(rand(1,N)>0.5)-1)+j*(2*(rand(1,N)>0.5)-1);

s=(1/sqrt(2))*ip;

n=1/sqrt(2)*[randn(1,N)+j*randn(1,N)];

y=s+10^(-Es_No_db(ii)/20)*n;

y_re=real(y);

y_im=imag(y);

iphat(find(y_re<0&y_im<0))=-1+-1*j;

iphat(find(y_re>=0&y_im>0))=1+1*j;

iphat(find(y_re<0&y_im>=0))=-1+1*j;

iphat(find(y_re>=0&y_im<0))=1-1*j;

nerr(ii)=size(find([ip-iphat]),2);

end

simser_qpsk=nerr/N;

theoryser_qpsk=erfc(sqrt(0.5*(10.^(Es_No_db/10))))-(1/4)*(erfc(sqrt(0.5*(10.^(Es_No_db/10))))).^2;

figure

semilogy(Es_No_db,theoryser_qpsk,'b.-');hold on;

semilogy(Es_No_db,simser_qpsk,'mx-');

axis([-3 15 10^-5 1]);grid on;

legend('theory','sim');

xlabel('Es/No,db');ylabel('Symbol Error rate');

title('Symbol Error Probability for QPSK');