From ae50c990eca8b82d677ed00da4f8998b3f8e03a4 Mon Sep 17 00:00:00 2001 From: Paul Sutton Date: Wed, 16 Apr 2014 17:06:34 +0100 Subject: [PATCH] Adding matlab files for arbitrary resampler --- matlab/resampler/arb_filter.mat | Bin 0 -> 1475 bytes matlab/resampler/arb_resample_linear.m | 46 ++++++++++++++++++++++++ matlab/resampler/arb_resample_nearest.m | 37 +++++++++++++++++++ matlab/resampler/arb_resample_test.m | 33 +++++++++++++++++ 4 files changed, 116 insertions(+) create mode 100644 matlab/resampler/arb_filter.mat create mode 100644 matlab/resampler/arb_resample_linear.m create mode 100644 matlab/resampler/arb_resample_nearest.m create mode 100644 matlab/resampler/arb_resample_test.m diff --git a/matlab/resampler/arb_filter.mat b/matlab/resampler/arb_filter.mat new file mode 100644 index 0000000000000000000000000000000000000000..735fbc233271f5701268d9738ba9ac073a1407c4 GIT binary patch literal 1475 zcmV;!1w8sqK~zjZLLfCRFd$7qR4ry{Y-KDUP;6mzW^ZzBIv__(PFO)UG%O%Pa%Ew3 zWn>_4ZaN@Tb!8wyaB?6qH6SrIIyE*rH8vnJFflYBARr(hARr(hARr(hARr(hARr(h zARr(hARr(hARr(hARr(hARr(B00000000000ZB~{0000x1pokeoJEy;RLp4@$EP|f zX`}77vGc8X0c5vrIwI%nYJBerVS%H(IyGog~`$dO>Id$-H4i! zE>3H65@TJPbl7EUv39qwoj>M1zq$N=@B2L8=kqZW2m}ts0)gTC_5Jei`p;{`@U@=c zzc)RBfxt6nt6-#H_>19}v}1ySheH78Wk0gLU*yLNUccBGc+8*I6-}R}-4e*_nqvYC zdV+ZVEqQ0y!w^YtivE9bm7rQxk-<-9-_ z`-QuWg4@PIlAY&2O(;d?=S%CHI&<_u&fZB%6tTi^#Imq(yr= zn1sS+&)Hu`(suLB8D~>v)Yb0orms#UlawoVzianU+ehka+r3jrv(IUczw{tYwN%|c z?vqYSvey@?oDY-#{osKz+boKeG=xoiag4OHHuW~Cvq>n)TNN-Zmr~6|ny&SEG(wlS zGBW-IJ)Yd%a6aZFnQhbmLm^g?*wA~vP$B%IOCf| zHG%W&X9*6Gq`msN;gb{!I^UA;Kqe=z@!x^uyuyZnqMZ>vXS)R zuF(2gZrN>iLPd3)Hu$E}D5Z{__bfc*{!<-K)YA{2{Qf%8-tub0{5oEqb0hxn$yyFC zQ5s2FYxtX34`We9HIJ3JTLh>tb9lAEl3O7c*&)e%$zW1BHx@3Gy)sktlY&8;WWz!p zzc|UKuRe!A&(MujL@Bt|nv!hSq>+Bq&{9RyDQeS8muN4l>FpU|wzGK^dC44GTElC} z?#A~+cSbdkYo2$h@^%yXj@!5`KCG3ZgZ#T<2HU9ocz9afIAzE@t;qrvGCYe!sci6 za$juKoxOczIzHKOsz^uTkfFq`3LPo`I=cRiT|bHQ9feKt{iN~LRh|C1pRCu;2ytxx zf5qqc-G~1T-v{@_bMRd31N*{0v2UCM=fXL0ZqxyFL7h-H)Dd+>ol$r60ewNA&^PoE zeMO(qcjN%MKu(Yw#xkk>Bd&~jm0&{}7!5m?(FlU%M%pv9y zbBeje9AmCA=a_qN09*hkzzuK&Tmfgm9dHO-0;j+&a12}n=fFL15L^T&!A)=!Tm@&r zU2qs&2B*Poa2#9*=fQn=0A7G6;0<^LUV&%e9e4;{f~Vjucnn^H=iohf5MKP?$zgB8 dqwp#`3-7|i@G?9NZ^Ps8Iy?{W{|&w3`HXB8)ZG98 literal 0 HcmV?d00001 diff --git a/matlab/resampler/arb_resample_linear.m b/matlab/resampler/arb_resample_linear.m new file mode 100644 index 000000000..4bfb4df03 --- /dev/null +++ b/matlab/resampler/arb_resample_linear.m @@ -0,0 +1,46 @@ +function out = arb_resample_linear(sig, rate) + +N = 32; +M = 8; +step = (1/rate)*N; + +load('arb_filter.mat'); + +figure;plot(Num);title('Filter impulse response'); +[h,w] = freqz(Num, 1); +figure;plot(20*log10(abs(h)));title('Filter freq response'); + +% Create polyphase partition +poly = reshape(Num, N, M); + +% Filter +sig = [zeros(1,(M/2)-1) sig]; +k=0; +acc=0; +index=0; +frac=0; +out = []; +while k < length(sig)-M + sig_reg = fliplr(sig(k+1:k+M)); + filt_reg1 = poly(index+1, :); + filt_reg2 = poly(mod(index+1,N)+1, :); + res1 = sig_reg*filt_reg1'; + res2 = sig_reg*filt_reg2'; + + if index+1 == 32 + res = res1; + else + res = res1 + (res2-res1)*frac; + end + + out = [out res]; + + acc = acc+step; + index = fix(acc); + while index >= N + acc = acc - N; + index = index - N; + k = k+1; + end + frac = abs(acc-index); +end diff --git a/matlab/resampler/arb_resample_nearest.m b/matlab/resampler/arb_resample_nearest.m new file mode 100644 index 000000000..0601aa169 --- /dev/null +++ b/matlab/resampler/arb_resample_nearest.m @@ -0,0 +1,37 @@ +function out = arb_resample_nearest(sig, rate) + +N = 32; +M = 8; +step = (1/rate)*N; + +load('arb_filter.mat'); + +figure;plot(Num);title('Filter impulse response'); +[h,w] = freqz(Num, 1); +figure;plot(20*log10(abs(h)));title('Filter frequency response'); + +% Create polyphase partition +poly = reshape(Num, N, M); + +% Filter +sig = [zeros(1,(M/2)-1) sig]; +k=0; +acc=0; +index=0; +frac=0; +out = []; +while k < length(sig)-M + sig_reg = fliplr(sig(k+1:k+M)); + filt_reg1 = poly(index+1, :); + res = sig_reg*filt_reg1'; + + out = [out res]; + + acc = acc+step; + index = round(acc); + while index >= N + acc = acc - N; + index = index - N; + k = k+1; + end +end \ No newline at end of file diff --git a/matlab/resampler/arb_resample_test.m b/matlab/resampler/arb_resample_test.m new file mode 100644 index 000000000..b6d661da4 --- /dev/null +++ b/matlab/resampler/arb_resample_test.m @@ -0,0 +1,33 @@ +close all +clear all + +up = 24; +down = 25; +d_rate = up/down; +Fs = 100; % Arbitrary sample rate (used for displays) +Fsin = 1; + +% Create a sine wave +t = 0:1/Fs:1-1/Fs; +sig = sin(2*pi*t); + +out = arb_resample_nearest(sig,d_rate); + +% matlab resample for comparison +out2 = resample(sig, up, down); +figure;hold on;title('Ours and matlabs'); +l = min(length(out), length(out2)); +stem(out(1:l)); +stem(out2(1:l), 'r', 'filled'); +diff = out2(1:l)-out(1:l); +figure;plot(diff);title('Difference between ours and matlabs'); + +figure; hold on;title('Original and resampled - no time scaling'); +stem(sig); +stem(out, 'r', 'filled'); + +% Time align and plot +figure;hold on;title('Original and resampled - with time scaling'); +stem((1:75)/Fs,real(sig(1:75))); +stem((1:72)/(Fs*d_rate),real(out(1:72)),'r','filled'); +xlabel('Time (sec)');ylabel('Signal value'); \ No newline at end of file