diff options
Diffstat (limited to 'macros/resample.sci')
-rw-r--r-- | macros/resample.sci | 121 |
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 |