## [636453]: fourier / dsti.m  Maximize  Restore  History

### 91 lines (73 with data), 2.1 kB

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90``` ```function c=dsti(f,L,dim) %DSTI Discrete Sine Transform type I % Usage: c=dsti(f); % c=dsti(f,L); % c=dsti(f,[],dim); % c=dsti(f,L,dim); % % DSTI(f) computes the discrete sine transform of type I of the % input signal f. If f is a matrix, then the transformation is applied to % each column. For N-D arrays, the transformation is applied to the first % dimension. % % DSTI(f,L) zero-pads or truncates f to length N before doing the % transformation. % % DSTI(f,[],dim) applies the transformation along dimension dim. % DSTI(f,L,dim) does the same, but pads or truncates to length L. % % The transform is real (output is real if input is real) and % it is orthonormal. % % This transform is its own inverse. % % Let f be a signal of length _L and let c=DSTI(f). Then % %M L-1 %M c(n+1) = sqrt(2/(L+1)) * sum sin(pi*(n+1)*(m+1)/(L+1)) %M m=0 %F \[ %F c\left(n+1\right)=\sqrt{\frac{2}{L+1}}\sum_{m=0}^{L-1}f\left(m+1\right)\sin\left(\frac{\pi \left(n+1\right)\left(m+1\right)}{L+1}\right) %F \] % % The implementation of this functions uses a simple algorithm that require % an FFT of length 2N+2, which might potentially be the product of a large % prime number. This may cause the function to sometimes execute slowly. % If guaranteed high speed is a concern, please consider using one of the % other DST transforms. % % See also: dcti, dstiii, dstiv % %R rayi90 wi94 % AUTHOR: Peter Soendergaard % TESTING: TEST_PUREFREQ % REFERENCE: REF_DSTI error(nargchk(1,3,nargin)); if nargin<3 dim=[]; end; if nargin<2 L=[]; end; [f,L,Ls,W,dim,permutedsize,order]=assert_sigreshape_pre(f,L,dim,'DSTI'); if ~isempty(L) f=postpad(f,L); end; if L==1 c=f; else c=zeros(L,W); s1=dft([zeros(1,W);... f;... zeros(1,W);... -flipud(f)]); % This could be done by a repmat instead. for w=1:W c(:,w)=s1(2:L+1,w)-s1(2*L+2:-1:L+3,w); end; c=c*i/2; if isreal(f) c=real(c); end; end; c=assert_sigreshape_post(c,dim,permutedsize,order); ```