ReSpeaker DSP V02

Dependencies:   mbed MbedJSONValue

Committer:
Arkadi
Date:
Thu Jun 20 09:06:46 2019 +0000
Revision:
14:8a4699aa69b5
Parent:
1:574b54755983
experiments version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Arkadi 1:574b54755983 1 % Arbitrary Magnitude Filter test on real WAV files
Arkadi 1:574b54755983 2 % Sampling frequency from pin D12
Arkadi 1:574b54755983 3 % For board F446RE
Arkadi 1:574b54755983 4 % Fd12 = 402 * 2; % KHz; for 4 sections
Arkadi 1:574b54755983 5 % Fd12 = 308 * 2; % KHz; for 6 sections
Arkadi 1:574b54755983 6 Fd12 = 250 * 2; % KHz; for 8 sections
Arkadi 1:574b54755983 7
Arkadi 1:574b54755983 8
Arkadi 1:574b54755983 9 %--------------------------------
Arkadi 1:574b54755983 10 % For old board
Arkadi 1:574b54755983 11 % Fd12 = 400 * 2; % KHz; for one section
Arkadi 1:574b54755983 12 % Fd12 = 290 * 2; % KHz; for two sections
Arkadi 1:574b54755983 13 % Fd12 = 190 * 2; % KHz; for four sections
Arkadi 1:574b54755983 14 % Fd12 = 142 * 2; % KHz; for six sections
Arkadi 1:574b54755983 15
Arkadi 1:574b54755983 16 % For iirlpnorm filter description see http://www.mathworks.com/help/dsp/ref/iirlpnorm.html
Arkadi 1:574b54755983 17
Arkadi 1:574b54755983 18 Nb = 16; % Numerator Order
Arkadi 1:574b54755983 19 Na = 16; % Denominator Order
Arkadi 1:574b54755983 20 P = [2 128]; % P'th norm
Arkadi 1:574b54755983 21 dens = 20; % Density Factor
Arkadi 1:574b54755983 22
Arkadi 1:574b54755983 23
Arkadi 1:574b54755983 24 % Frequency Vector - real, Hz
Arkadi 1:574b54755983 25 Freal = [0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115 120 125 130 135 140 Fd12/2];
Arkadi 1:574b54755983 26 % Amplitudas calculation
Arkadi 1:574b54755983 27 [A, dBDiff] = AmplCalc(length(Freal));
Arkadi 1:574b54755983 28 % Frequency Vector - normalized frequences = Freal / (Fd12/2) wher Fd12 is a board sampling frequency
Arkadi 1:574b54755983 29 % used as a parameter for filter calculation
Arkadi 1:574b54755983 30 Fnormal = Freal / (Fd12/2);
Arkadi 1:574b54755983 31 % Weights has one entry per frequency point (the same length as F and A) which tells iirlpnorm how
Arkadi 1:574b54755983 32 % much emphasis to put on minimizing the error in the vicinity of each frequency point relative to the other points.
Arkadi 1:574b54755983 33 W = [ones(1,30)];
Arkadi 1:574b54755983 34 % Frequency Edges, normalized (single band)
Arkadi 1:574b54755983 35 E = [0 1];
Arkadi 1:574b54755983 36
Arkadi 1:574b54755983 37 % Hints
Arkadi 1:574b54755983 38 %
Arkadi 1:574b54755983 39 % This is a weighted least-pth optimization.
Arkadi 1:574b54755983 40 % Check the radii and locations of the poles and zeros for your filter (with zplane function). If the zeros are on the unit circle
Arkadi 1:574b54755983 41 % and the poles are well inside the unit circle, try increasing the order of the numerator or reducing the error weighting in the stopband.
Arkadi 1:574b54755983 42 % Similarly, if several poles have a large radii and the zeros are well inside of the unit circle, try increasing the order
Arkadi 1:574b54755983 43 % of the denominator or reducing the error weighting in the passband.
Arkadi 1:574b54755983 44
Arkadi 1:574b54755983 45 % Analysis parameters
Arkadi 1:574b54755983 46 TestFilter = true; % test filter on WAV file
Arkadi 1:574b54755983 47 AmplitudeAnalysis = true;
Arkadi 1:574b54755983 48 FrequencyAnalysis = true;
Arkadi 1:574b54755983 49 SpectrogramAnalysis = true;
Arkadi 1:574b54755983 50
Arkadi 1:574b54755983 51 [num,den,err,SOS,G] = iirlpnorm(Nb, Na, Fnormal, E, A, W, P, {dens});
Arkadi 1:574b54755983 52
Arkadi 1:574b54755983 53 MyArbMagFilter = dfilt.df1sos(SOS, G);
Arkadi 1:574b54755983 54
Arkadi 1:574b54755983 55 % [MyArbMagFilter,SOS, G] = ArbMagFilterDesign(4, 4);
Arkadi 1:574b54755983 56 fvtool(MyArbMagFilter, 'Fs', Fd12*1000);
Arkadi 1:574b54755983 57
Arkadi 1:574b54755983 58 if (TestFilter) % test filter on WAV file
Arkadi 1:574b54755983 59 % ybat - samples
Arkadi 1:574b54755983 60 % Fs - sampling frequency
Arkadi 1:574b54755983 61
Arkadi 1:574b54755983 62 % this line should be corrected depended on location of WAV file
Arkadi 1:574b54755983 63 mainfilename ='C:\Users\Igor\OneDrive\dev\Bats\tests\kuhlii2';
Arkadi 1:574b54755983 64 [ybat,Fs] = audioread(strcat(mainfilename,'.wav'));
Arkadi 1:574b54755983 65 % [ybat,Fs] = audioread('C:\Users\Igor\OneDrive\dev\Bats\tests\sasha_white.wav');
Arkadi 1:574b54755983 66
Arkadi 1:574b54755983 67 fprintf('Amount of samples: %d; Sampling frequency %d\n',length(ybat), Fs)
Arkadi 1:574b54755983 68 t = linspace(0,length(ybat)/Fs,length(ybat));
Arkadi 1:574b54755983 69 % Apply filter
Arkadi 1:574b54755983 70 yf = filter(MyArbMagFilter,ybat);
Arkadi 1:574b54755983 71
Arkadi 1:574b54755983 72 FilterResultsAnalysis(t, ybat, yf, Fs, AmplitudeAnalysis, FrequencyAnalysis, SpectrogramAnalysis);
Arkadi 1:574b54755983 73 audiowrite(strcat(mainfilename,'-filtered.wav'), yf, Fs);
Arkadi 1:574b54755983 74 end
Arkadi 1:574b54755983 75
Arkadi 1:574b54755983 76 % Print filter in the form, suitable for copying into C code
Arkadi 1:574b54755983 77 columns = size(SOS,2);
Arkadi 1:574b54755983 78 lines = size(SOS,1);
Arkadi 1:574b54755983 79 fprintf('/*\nIIRLPNORM FILTER DESIGN, %s, %d sections \nFrequency ranges (for Fs=%5.1f*2 KHz), amplitudas and weights\nF ', datestr(now), lines, Fd12/2);
Arkadi 1:574b54755983 80 fprintf('%5.1f ', Freal)
Arkadi 1:574b54755983 81 fprintf('\n ');
Arkadi 1:574b54755983 82 fprintf('%5.2f ', Fnormal)
Arkadi 1:574b54755983 83 fprintf('\nA ');
Arkadi 1:574b54755983 84 fprintf('%5.1f ', A);
Arkadi 1:574b54755983 85 fprintf('\nW ');
Arkadi 1:574b54755983 86 fprintf('%4.2f ', W);
Arkadi 1:574b54755983 87 fprintf('\n*/\n');
Arkadi 1:574b54755983 88 % fprintf('char FilterType[] = "IIRLPNORM";\n');
Arkadi 1:574b54755983 89 fprintf('float SOSMat[%d][%d] = {\n', lines, columns);
Arkadi 1:574b54755983 90 for i =1:lines
Arkadi 1:574b54755983 91 fprintf(' %f, ', SOS(i,1:columns));
Arkadi 1:574b54755983 92 fprintf('\n');
Arkadi 1:574b54755983 93 end
Arkadi 1:574b54755983 94 fprintf('\b\b\b\n};\n'); %\b\b\b - erase <\n>, <space> and <,>
Arkadi 1:574b54755983 95 fprintf('float Gscale = %f;\n\n',G);
Arkadi 1:574b54755983 96
Arkadi 1:574b54755983 97
Arkadi 1:574b54755983 98
Arkadi 1:574b54755983 99