summaryrefslogtreecommitdiff
path: root/macros/resample.sci
diff options
context:
space:
mode:
Diffstat (limited to 'macros/resample.sci')
-rw-r--r--macros/resample.sci121
1 files changed, 118 insertions, 3 deletions
diff --git a/macros/resample.sci b/macros/resample.sci
index 3e0e878..e2d9f79 100644
--- a/macros/resample.sci
+++ b/macros/resample.sci
@@ -1,18 +1,22 @@
function [y, h] = resample( x, p, q, h )
//This function resamples in the input sequence x supplied by a factor of p/q.
+
//Calling Sequence
//y = resample(x, p, q)
//y = resample(x, p, q, h)
//[y, h] = resample(...)
-//Parameters
+
+//Parameters
//x: scalar, vector or matrix of real or complex numbers
//p: positive integer value
//q: positive integer value
//h: scalar, vector or matrix of real or complex numbers
+
//Description
//This is an Octave function.
-//This function resamples in the input sequence x supplied by a factor of p/q. If x is a matrix, then every column is resampled.hange the sample rate of x by a factor of p/q.
-//This is performed using a polyphase algorithm. The impulse response h, given as parameter 4, of the antialiasing filter is either specified or designed with a Kaiser-windowed sinecard.
+//This function resamples in the input sequence x supplied by a factor of p/q. If x is a matrix, then every column is resampled.hange the sample rate of x by a factor of p/q.
+//This is performed using a polyphase algorithm. The impulse response h, given as parameter 4, of the antialiasing filter is either specified or designed with a Kaiser-windowed sinecard.
+
//Examples
//resample(1,2,3)
//ans = 0.66667
@@ -41,4 +45,115 @@ end
endfunction
+//**************************************************************************************************
+//Tried to impement without callOctave but fot this it requires ufirdn function which implemented in .cc file in octave, simple implementation of upfirdn doesn't work for resample function
+//**************************************************************************************************
+
+
+//function [y, h] = resample( x, p, q, h )
+// nargin = argn(2);
+//
+// [rows, columns] = size(x) ;
+//
+// if nargin < 3 | nargin > 4
+// error("resample.sci : invalid number of inputs");
+// elseif or([p q]<=0) | or([p q]~=floor([p q])),
+// error("resample.sci: p and q must be positive integers");
+// end
+//
+//// ## simplify decimation and interpolation factors
+//
+// great_common_divisor=gcd([p,q]);
+// if (great_common_divisor>1)
+// p = double(p) / double (great_common_divisor);
+// q = double(q) / double (great_common_divisor);
+// else
+// p = double(p);
+// q = double(q);
+// end
+//
+//// ## filter design if required
+//
+// if (nargin < 4)
+//
+//// ## properties of the antialiasing filter
+//
+// log10_rejection = -3.0;
+// stopband_cutoff_f = 1 / (2 * max (p, q));
+// roll_off_width = stopband_cutoff_f / 10.0;
+//
+//// ## determine filter length
+//// ## use empirical formula from [2] Chap 7, Eq. (7.63) p 476
+//
+// rejection_dB = -20.0*log10_rejection;
+// L = ceil((rejection_dB-8.0) / (28.714 * roll_off_width));
+//
+//// ## ideal sinc filter
+//
+// t=(-L:L)';
+// ideal_filter=2*p*stopband_cutoff_f*sinc(2*stopband_cutoff_f*t);
+//
+//// ## determine parameter of Kaiser window
+//// ## use empirical formula from [2] Chap 7, Eq. (7.62) p 474
+//
+// if ((rejection_dB>=21) & (rejection_dB<=50))
+// beta = 0.5842 * (rejection_dB-21.0)^0.4 + 0.07886 * (rejection_dB-21.0);
+// elseif (rejection_dB>50)
+// beta = 0.1102 * (rejection_dB-8.7);
+// else
+// beta = 0.0;
+// end
+//
+//// ## apodize ideal filter response
+//
+// h=kaiser(2*L+1,beta).*ideal_filter;
+//
+// end
+//
+//// ## check if input is a row vector
+// isrowvector=%F;
+// if ((rows==1) & (columns>1))
+// x=x(:);
+// isrowvector=%T;
+// end
+//
+//// ## check if filter is a vector
+// if ~isvector(h)
+// error("resample.sci: the filter h should be a vector");
+// end
+//
+// Lx = rows;
+// Lh = length(h);
+// L = ( Lh - 1 )/2.0;
+// Ly = ceil(Lx*p/q);
+//
+//// ## pre and postpad filter response
+//
+// nz_pre = floor(q-pmodulo(L,q));
+//// hpad = prepad(h,Lh+nz_pre);
+// hpad = h ;
+// for i = 1:Lh+nz_pre-length(h)
+// hpad = [0;hpad];
+// end
+//
+// offset = floor((L+nz_pre)/q);
+// nz_post = 0;
+// while ceil( ( (Lx-1)*p + nz_pre + Lh + nz_post )/q ) - offset < Ly
+// nz_post = nz_post + 1;
+// end
+//
+// //hpad = postpad(hpad,Lh + nz_pre + nz_post);
+// for i = 1:Lh + nz_pre + nz_post-length(hpad)
+// hpad = [hpad;0];
+// end
+//
+//// ## filtering
+// xfilt = upfirdn(x,hpad,p,q);
+// y = xfilt(offset+1:offset+Ly,:);
+//
+// if isrowvector,
+// y=y.';
+// end
+//
+//endfunctio