clear all;
close all;
% Test with synthetically generated sinusoidal wave
f=1000;% Frequency of the audio signal
Fs =64000; % Sampling rate is 4000 samples per second.
t = [1/Fs:1/Fs:1];% total time for simulation=0.05 second.
% Number of samples=4000
Am=1.0;
signal = Am*sin(2*pi*1000*t); % Original signal
figure(1);
plot(t(1:256),signal(1:256))
set(gca,'ytick',[ -1.0   0 1.0 ])
title('A segment of synthetically generated sinusiodal wavform')
grid on
xlabel( 'time(sec)');
ylabel( 'Amplitude(volt)');


% Quantization Part
maximumvalue=max(signal);
minimumvalue=min(signal);
interval=(maximumvalue-minimumvalue)/255; % interval:
partition = [minimumvalue:interval:maximumvalue]; % -1:0.0078:1
codebook = [(minimumvalue-interval):interval:maximumvalue]; % -1.0078:0.0078:1, Total number of
%codebook's valu must exceed by 1 from partition.So minimumvalue-interval is used.
[index,quants,distor] = quantiz(signal,partition,codebook);


% Convertion of deci  into binary from least  to most significant
indxtrn=index';
for i=1:64000
matrix(i,1:1:8)=bitget(uint8(indxtrn(i)),1:1:8);
end,


% The part of producing baseband signal
% matrix is of  4000 rows X 8 columns
matrixtps=matrix';% matrixtps is a matrix of 8 rows X4000 columns
% Baseband is produced, it has 32000 bits
baseband=reshape(matrixtps,64000*8,1);
Tb=1/512000;
% bit rate 32 kbps
time=[0:Tb:1];
figure(2);
stairs(time(1:500),baseband(1:500))
title(' A segment of baseband signal')
xlabel('Time(sec)')
ylabel('Binary value')
set(gca,'ytick',[0  1 ])
axis([0,time(500),0,1])


%Quadrature phase shift keying modulation and demodulation
M=16;
k=log2(M);
baseband=double(baseband);
% bit to symbol mapping
symbol=bi2de(reshape(baseband,k,length(baseband)/k).','left-msb');
Quadrature_amplitude_modulated_data = qammod(symbol,M);
% demodulation of Quadrature phase shift keying data
Quadrature_amplitude_demodulated_data = qamdemod(Quadrature_amplitude_modulated_data,M);


%The part of retrieving orginal signal from Binary_phase_shift_keying_demodulated_data.
% symbol to  bit mapping
% 2-bit symbol to Binary bit mapping
Retrieved_bit = de2bi(Quadrature_amplitude_demodulated_data,'left-msb');
Retrieved_bit=Retrieved_bit';
Retrieved_bit=reshape(Retrieved_bit, 512000,1);
convert=reshape(Retrieved_bit,8,64000); % First reshaping and then transposing
matrixtps=double(matrixtps);
convert=convert' ; % 4000 rows X 8 columns
% binary to decimally converted value
intconv=bi2de(convert); % converted into interger values(0-255) of 4000 samples
% intconv is 4000 rows X 1 column
sample_value=minimumvalue +intconv.*interval;


% The part of Comparison display of orginal signal and retrieved signal
figure(3)
subplot(2,1,1)
plot(t(1:256),signal(1:256));
set(gca,'ytick',[ -1.0   0 1.0 ])
axis([0,t(257),-1,1])
title('Graph for a segment of recoded Audio signal')
xlabel('Time(sec)')
ylabel('Amplitude')
grid on
subplot(2,1,2)
plot(time(1:256),sample_value(1:256));
axis([0,time(257),-1,1])
set(gca,'ytick',[ -1.0   0 1.0 ])
title('Graph for a segment of retrieved Audio signal')
xlabel('Time(sec)')
ylabel('Amplitude')
grid on

%error mapping and display
[number1,ratio]= symerr(symbol,Quadrature_amplitude_demodulated_data ) % symbol error
[number2,ratio]= biterr(Retrieved_bit,baseband)
[number3,ratio]= biterr(convert',matrixtps)
[number4,ratio]= biterr(intconv',index);