Tau ReSpeaker Setup V01
Dependencies: MbedJSONValue mbed
Fork of TAU_ReSpeaker_DSP_Test by
Matlab_Script/ArbMagFilter.txt@1:574b54755983, 2018-02-11 (annotated)
- Committer:
- Arkadi
- Date:
- Sun Feb 11 15:13:52 2018 +0000
- Revision:
- 1:574b54755983
Added GUI control for HPF and no filter modes
Who changed what in which revision?
User | Revision | Line number | New 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 |