Ultrasonic Audio File Player
Dependencies: mbed
Fork of TAU_ZOOLOG_Chirp_Generator by
Matlab_Script/WAVE_Generator.txt@24:0b683b3ff39e, 2018-04-25 (annotated)
- Committer:
- Arkadi
- Date:
- Wed Apr 25 08:54:23 2018 +0000
- Revision:
- 24:0b683b3ff39e
added matlab script
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Arkadi | 24:0b683b3ff39e | 1 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
Arkadi | 24:0b683b3ff39e | 2 | % Generate Signal coeficients - 23/04/2018 % |
Arkadi | 24:0b683b3ff39e | 3 | % Arkadi Rafalovich - % Arkadiraf@gmail.com % |
Arkadi | 24:0b683b3ff39e | 4 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
Arkadi | 24:0b683b3ff39e | 5 | clc |
Arkadi | 24:0b683b3ff39e | 6 | clear |
Arkadi | 24:0b683b3ff39e | 7 | |
Arkadi | 24:0b683b3ff39e | 8 | %% Generate coeficients from wav file: |
Arkadi | 24:0b683b3ff39e | 9 | filename= 'audio.001531.wav'; |
Arkadi | 24:0b683b3ff39e | 10 | |
Arkadi | 24:0b683b3ff39e | 11 | % signal Generator sample rate: |
Arkadi | 24:0b683b3ff39e | 12 | %sampleFreq=1*10^6; |
Arkadi | 24:0b683b3ff39e | 13 | sampleFreq=375*10^3; |
Arkadi | 24:0b683b3ff39e | 14 | |
Arkadi | 24:0b683b3ff39e | 15 | % Max samples |
Arkadi | 24:0b683b3ff39e | 16 | maxNumSamples=200*10^3; % Max allowed samples |
Arkadi | 24:0b683b3ff39e | 17 | |
Arkadi | 24:0b683b3ff39e | 18 | % read WAVE file |
Arkadi | 24:0b683b3ff39e | 19 | [signalSamples,signalFreq] = audioread(filename); |
Arkadi | 24:0b683b3ff39e | 20 | |
Arkadi | 24:0b683b3ff39e | 21 | % plot signal |
Arkadi | 24:0b683b3ff39e | 22 | figure(1); |
Arkadi | 24:0b683b3ff39e | 23 | plot (signalSamples); |
Arkadi | 24:0b683b3ff39e | 24 | title(['Audio file: ',filename, ' Sample Rate: ',num2str(signalFreq/1000),'KHz']); |
Arkadi | 24:0b683b3ff39e | 25 | |
Arkadi | 24:0b683b3ff39e | 26 | |
Arkadi | 24:0b683b3ff39e | 27 | % how many sample in signal : Verify not to exceed max samokes |
Arkadi | 24:0b683b3ff39e | 28 | signalNumSamples=size(signalSamples,1); |
Arkadi | 24:0b683b3ff39e | 29 | |
Arkadi | 24:0b683b3ff39e | 30 | % adjusting sample rates to fit the system sample rat |
Arkadi | 24:0b683b3ff39e | 31 | sampleRateRatio = sampleFreq / signalFreq; |
Arkadi | 24:0b683b3ff39e | 32 | |
Arkadi | 24:0b683b3ff39e | 33 | % for improved performace, add signal interpolation - sometime may actually happen |
Arkadi | 24:0b683b3ff39e | 34 | if (sampleRateRatio > 1) %extending samples |
Arkadi | 24:0b683b3ff39e | 35 | % basicly creating a vector to indicate which sample to take from the |
Arkadi | 24:0b683b3ff39e | 36 | % signals samples based on the frequencies ratio |
Arkadi | 24:0b683b3ff39e | 37 | samplesIndexVector = round((1:1/sampleRateRatio:(signalNumSamples))); |
Arkadi | 24:0b683b3ff39e | 38 | else % downsampling signal |
Arkadi | 24:0b683b3ff39e | 39 | samplesIndexVector = round((1:1/sampleRateRatio:(signalNumSamples))); |
Arkadi | 24:0b683b3ff39e | 40 | end |
Arkadi | 24:0b683b3ff39e | 41 | % generated signal number of samples |
Arkadi | 24:0b683b3ff39e | 42 | newSignalNumSamples = size(samplesIndexVector,2); |
Arkadi | 24:0b683b3ff39e | 43 | % generate a new vector for the data set based on the samplesIndexVector |
Arkadi | 24:0b683b3ff39e | 44 | newSignalSamples = zeros(newSignalNumSamples,1); |
Arkadi | 24:0b683b3ff39e | 45 | for ii=1:newSignalNumSamples |
Arkadi | 24:0b683b3ff39e | 46 | newSignalSamples(ii) = signalSamples(samplesIndexVector(ii)); |
Arkadi | 24:0b683b3ff39e | 47 | end |
Arkadi | 24:0b683b3ff39e | 48 | |
Arkadi | 24:0b683b3ff39e | 49 | % normalize signal |
Arkadi | 24:0b683b3ff39e | 50 | newSignalSamples = newSignalSamples / (max(abs(newSignalSamples))); |
Arkadi | 24:0b683b3ff39e | 51 | |
Arkadi | 24:0b683b3ff39e | 52 | % plot signal |
Arkadi | 24:0b683b3ff39e | 53 | figure(2); |
Arkadi | 24:0b683b3ff39e | 54 | plot (newSignalSamples); |
Arkadi | 24:0b683b3ff39e | 55 | title([num2str(sampleFreq/1000),' KHz sample rate signal: ',filename]); |
Arkadi | 24:0b683b3ff39e | 56 | |
Arkadi | 24:0b683b3ff39e | 57 | % scale signal to 75% |
Arkadi | 24:0b683b3ff39e | 58 | newSignalSamples = newSignalSamples * 0.75; |
Arkadi | 24:0b683b3ff39e | 59 | % plot signal |
Arkadi | 24:0b683b3ff39e | 60 | figure(3); |
Arkadi | 24:0b683b3ff39e | 61 | plot (newSignalSamples); |
Arkadi | 24:0b683b3ff39e | 62 | title(['Scaled signal: ',filename]); |
Arkadi | 24:0b683b3ff39e | 63 | |
Arkadi | 24:0b683b3ff39e | 64 | %% cast data to 12bit (dac resolution) |
Arkadi | 24:0b683b3ff39e | 65 | sig_12bit=cast(((newSignalSamples+1)*4095/2),'UINT16'); |
Arkadi | 24:0b683b3ff39e | 66 | |
Arkadi | 24:0b683b3ff39e | 67 | figure(4); |
Arkadi | 24:0b683b3ff39e | 68 | plot(sig_12bit) |
Arkadi | 24:0b683b3ff39e | 69 | title(['12bit signal: ',filename]); |
Arkadi | 24:0b683b3ff39e | 70 | |
Arkadi | 24:0b683b3ff39e | 71 | %% trim to max samples |
Arkadi | 24:0b683b3ff39e | 72 | if (newSignalNumSamples > maxNumSamples) |
Arkadi | 24:0b683b3ff39e | 73 | numSamples = maxNumSamples; |
Arkadi | 24:0b683b3ff39e | 74 | else |
Arkadi | 24:0b683b3ff39e | 75 | numSamples = newSignalNumSamples; |
Arkadi | 24:0b683b3ff39e | 76 | end |
Arkadi | 24:0b683b3ff39e | 77 | |
Arkadi | 24:0b683b3ff39e | 78 | %plot trimed signal |
Arkadi | 24:0b683b3ff39e | 79 | figure(5); |
Arkadi | 24:0b683b3ff39e | 80 | plot(sig_12bit(1:numSamples)); |
Arkadi | 24:0b683b3ff39e | 81 | title(['trimmed signal: ',filename]); |
Arkadi | 24:0b683b3ff39e | 82 | |
Arkadi | 24:0b683b3ff39e | 83 | %% generate header file with desire coeficients |
Arkadi | 24:0b683b3ff39e | 84 | % check if file exists, delete if so. |
Arkadi | 24:0b683b3ff39e | 85 | if exist('signal.h', 'file')==2 |
Arkadi | 24:0b683b3ff39e | 86 | delete('signal.h'); |
Arkadi | 24:0b683b3ff39e | 87 | end |
Arkadi | 24:0b683b3ff39e | 88 | |
Arkadi | 24:0b683b3ff39e | 89 | % creat new file |
Arkadi | 24:0b683b3ff39e | 90 | file_id=fopen('signal.h','w'); |
Arkadi | 24:0b683b3ff39e | 91 | |
Arkadi | 24:0b683b3ff39e | 92 | % file heading |
Arkadi | 24:0b683b3ff39e | 93 | fprintf(file_id,'/*\r\n'); |
Arkadi | 24:0b683b3ff39e | 94 | fprintf(file_id,'Header File Generated by Matlab Script: WAVE_Generator.m \r\n'); |
Arkadi | 24:0b683b3ff39e | 95 | fprintf(file_id,'file:%s \r\n' , filename); |
Arkadi | 24:0b683b3ff39e | 96 | fprintf(file_id,'Number of Samples: %d \r\n', numSamples); |
Arkadi | 24:0b683b3ff39e | 97 | fprintf(file_id,'Sample Rate: %d kHz \r\n', sampleFreq/1000); |
Arkadi | 24:0b683b3ff39e | 98 | fprintf(file_id,'*/\r\n'); |
Arkadi | 24:0b683b3ff39e | 99 | |
Arkadi | 24:0b683b3ff39e | 100 | %init variable |
Arkadi | 24:0b683b3ff39e | 101 | fprintf(file_id,'#define NUM_SAMPLES %d\r\n', numSamples); |
Arkadi | 24:0b683b3ff39e | 102 | fprintf(file_id,'const uint16_t chirpData[NUM_SAMPLES] = { \r\n'); |
Arkadi | 24:0b683b3ff39e | 103 | |
Arkadi | 24:0b683b3ff39e | 104 | for i =1:(numSamples-1) |
Arkadi | 24:0b683b3ff39e | 105 | fprintf(file_id,' %d, ', sig_12bit(i)); |
Arkadi | 24:0b683b3ff39e | 106 | if (mod(i,10)==0) %insert spaces |
Arkadi | 24:0b683b3ff39e | 107 | fprintf(file_id,'\r\n'); |
Arkadi | 24:0b683b3ff39e | 108 | end |
Arkadi | 24:0b683b3ff39e | 109 | end |
Arkadi | 24:0b683b3ff39e | 110 | fprintf(file_id,' %d}; \r\n', sig_12bit(end)); |
Arkadi | 24:0b683b3ff39e | 111 | % add last sample |
Arkadi | 24:0b683b3ff39e | 112 | |
Arkadi | 24:0b683b3ff39e | 113 | % close file |
Arkadi | 24:0b683b3ff39e | 114 | fclose(file_id); |
Arkadi | 24:0b683b3ff39e | 115 | |
Arkadi | 24:0b683b3ff39e | 116 |