%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Generate Signal coeficients - 23/04/2018          %
% Arkadi Rafalovich - % Arkadiraf@gmail.com         %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc
clear

%% Generate coeficients from wav file:
filename= 'audio.001531.wav';

% signal Generator sample rate:
%sampleFreq=1*10^6;
sampleFreq=375*10^3;

% Max samples
maxNumSamples=200*10^3; % Max allowed samples

% read WAVE file
[signalSamples,signalFreq] = audioread(filename);

% plot signal
figure(1);
plot (signalSamples);
title(['Audio file:  ',filename, ' Sample Rate: ',num2str(signalFreq/1000),'KHz']);


% how many sample in signal : Verify not to exceed max samokes
signalNumSamples=size(signalSamples,1);

% adjusting sample rates to fit the system sample rat
sampleRateRatio = sampleFreq / signalFreq;

% for improved performace, add signal interpolation - sometime may actually happen
if (sampleRateRatio > 1) %extending samples
    % basicly creating a vector to indicate which sample to take from the
    % signals samples based on the frequencies ratio
    samplesIndexVector = round((1:1/sampleRateRatio:(signalNumSamples)));
else % downsampling signal
    samplesIndexVector = round((1:1/sampleRateRatio:(signalNumSamples)));
end
% generated signal number of samples
newSignalNumSamples = size(samplesIndexVector,2);
% generate a new vector for the data set based on the samplesIndexVector
newSignalSamples = zeros(newSignalNumSamples,1);
for ii=1:newSignalNumSamples
newSignalSamples(ii) = signalSamples(samplesIndexVector(ii));
end

% normalize signal
newSignalSamples = newSignalSamples / (max(abs(newSignalSamples)));

% plot signal
figure(2);
plot (newSignalSamples);
title([num2str(sampleFreq/1000),' KHz sample rate signal:  ',filename]);

% scale signal to 75%
newSignalSamples = newSignalSamples * 0.75;
% plot signal
figure(3);
plot (newSignalSamples);
title(['Scaled signal:  ',filename]);

%% cast data to 12bit (dac resolution)
sig_12bit=cast(((newSignalSamples+1)*4095/2),'UINT16');

figure(4);
plot(sig_12bit)
title(['12bit signal:  ',filename]);

%% trim to max samples
if (newSignalNumSamples > maxNumSamples)
    numSamples = maxNumSamples;
else
    numSamples = newSignalNumSamples;
end

%plot trimed signal
figure(5);
plot(sig_12bit(1:numSamples));
title(['trimmed signal:  ',filename]);
    
%% generate header file with desire coeficients
% check if file exists, delete if so.
if exist('signal.h', 'file')==2
  delete('signal.h');
end

% creat new file
file_id=fopen('signal.h','w');

% file heading
fprintf(file_id,'/*\r\n');
fprintf(file_id,'Header File Generated by Matlab Script: WAVE_Generator.m \r\n');
fprintf(file_id,'file:%s \r\n' , filename);
fprintf(file_id,'Number of Samples: %d \r\n', numSamples);
fprintf(file_id,'Sample Rate: %d kHz \r\n', sampleFreq/1000);
fprintf(file_id,'*/\r\n');

%init variable
fprintf(file_id,'#define NUM_SAMPLES %d\r\n', numSamples);
fprintf(file_id,'const uint16_t chirpData[NUM_SAMPLES] = { \r\n');

for i =1:(numSamples-1)
    fprintf(file_id,' %d, ', sig_12bit(i));
    if (mod(i,10)==0) %insert spaces
        fprintf(file_id,'\r\n');
    end
end
fprintf(file_id,' %d}; \r\n', sig_12bit(end));
% add last sample

% close file
fclose(file_id);


