4
# fast discrete cosine transforms of real sequences (using the fft)
5
# These implement the DCT-II and inverse DCT-II (DCT-III)
6
# described at http://en.wikipedia.org/wiki/Discrete_cosine_transform
9
"""Discrete cosine transform based on the FFT.
11
For even-length signals it uses an N-point FFT
12
For odd-length signals it uses a 2N-point FFT.
21
slices[k].append(slice(None))
24
slices[0][axis] = slice(None,N/2)
25
slices[1][axis] = slice(None,None,2)
26
slices[2][axis] = slice(N/2,None)
27
slices[3][axis] = slice(N,None,-2)
29
newshape = list(x.shape)
31
xtilde = sb.empty(newshape,sb.float64)
32
slices[0][axis] = slice(None,N)
33
slices[2][axis] = slice(N,None)
34
slices[3][axis] = slice(None,None,-1)
37
slices[k] = tuple(slices[k])
38
xtilde[slices[0]] = x[slices[1]]
39
xtilde[slices[2]] = x[slices[3]]
40
Xt = sb.fft(xtilde,axis=axis)
41
pk = sb.exp(-1j*pi*sb.arange(N)/(2*N))
61
slices[k].append(slice(None))
64
ak = sb.r_[1.0,[2]*(N-1)]*sb.exp(1j*pi*k/(2*N))
68
xhat = sb.real(sb.ifft(v*ak,axis=axis))
70
slices[0][axis] = slice(None,None,2)
71
slices[1][axis] = slice(None,N/2)
72
slices[2][axis] = slice(N,None,-2)
73
slices[3][axis] = slice(N/2,None)
75
slices[k] = tuple(slices[k])
76
x[slices[0]] = xhat[slices[1]]
77
x[slices[2]] = xhat[slices[3]]
80
ak = 2*sb.exp(1j*pi*k/(2*N))
84
newshape = list(v.shape)
86
Y = zeros(newshape,sb.Complex)
88
#Y[(N+1):] = conj(Y[N:0:-1])
89
slices[0][axis] = slice(None,N)
90
slices[1][axis] = slice(None,None)
91
slices[2][axis] = slice(N+1,None)
92
slices[3][axis] = slice((N-1),0,-1)
94
Y[slices[2]] = conj(Y[slices[3]])
95
x = sb.real(sb.ifft(Y,axis=axis))[slices[0]]
98
def dct2(x,axes=(-1,-2)):
99
return dct(dct(x,axis=axes[0]),axis=axes[1])
101
def idct2(v,axes=(-1,-2)):
102
return idct(idct(v,axis=axes[0]),axis=axes[1])
104
def dctn(x,axes=None):
106
axes = sb.arange(len(x.shape))
109
res = dct(res,axis=k)
112
def idctn(v,axes=None):
114
axes = sb.arange(len(v.shape))
117
res = idct(res,axis=k)
123
C = sb.cos(pi*(2*n+1)*l/(2*N))
130
return dot(transpose(CM),dot(x,CN))
134
iCM = linalg.inv(makeC(M))
135
iCN = linalg.inv(makeC(N))
136
return dot(transpose(iCM),dot(v,iCN))
140
C = sin(pi*(k+1)*(n+1)/(N+1))
145
"""Discrete Sine Transform (DST-I)
147
Implemented using 2(N+1)-point FFT
148
xsym = r_[0,x,0,-x[::-1]]
149
DST = (-imag(fft(xsym))/2)[1:(N+1)]
151
adjusted to work over an arbitrary axis for entire n-dim array
159
slices[k].append(slice(None))
160
newshape = list(x.shape)
161
newshape[axis] = 2*(N+1)
162
xtilde = sb.zeros(newshape,sb.float64)
163
slices[0][axis] = slice(1,N+1)
164
slices[1][axis] = slice(N+2,None)
165
slices[2][axis] = slice(None,None,-1)
167
slices[k] = tuple(slices[k])
168
xtilde[slices[0]] = x
169
xtilde[slices[1]] = -x[slices[2]]
170
Xt = sb.fft(xtilde,axis=axis)
171
return (-sb.imag(Xt)/2)[slices[0]]
180
slices[k].append(slice(None))
181
newshape = list(v.shape)
182
newshape[axis] = 2*(N+1)
183
Xt = sb.zeros(newshape,sb.Complex)
184
slices[0][axis] = slice(1,N+1)
185
slices[1][axis] = slice(N+2,None)
186
slices[2][axis] = slice(None,None,-1)
189
slices[k] = tuple(slices[k])
191
Xt[slices[1]] = val[slices[2]]
192
xhat = sb.real(sb.ifft(Xt,axis=axis))
193
return xhat[slices[0]]
195
def dst2(x,axes=(-1,-2)):
196
return dst(dst(x,axis=axes[0]),axis=axes[1])
198
def idst2(v,axes=(-1,-2)):
199
return idst(idst(v,axis=axes[0]),axis=axes[1])
201
def dstn(x,axes=None):
203
axes = sb.arange(len(x.shape))
206
res = dst(res,axis=k)
209
def idstn(v,axes=None):
211
axes = sb.arange(len(v.shape))
214
res = idst(res,axis=k)
217
def digitrevorder(x,base):
226
raise ValueError, "Length of data must be power of base."
229
vec = r_[[base**n for n in range(L)]]
230
newx = x[sb.newaxis,:]*vec[:,sb.newaxis]
232
for k in range(L-1,-1,-1):
233
newx[k] = x // vec[k]
234
x = x - newx[k]*vec[k]
238
# construct new result from reversed digts
245
return digitrevorder(x,2)
250
"""Walsh-Hadamaard Transform (sequency ordered)
252
adapted from MATLAB algorithm published on the web by
253
Author: Gylson Thomas
254
e-mail: gylson_thomas@yahoo.com
255
Asst. Professor, Electrical and Electronics Engineering Dept.
256
MES College of Engineering Kuttippuram,
257
Kerala, India, February 2005.
259
Reference: N.Ahmed, K.R. Rao, "Orthogonal Transformations for
260
Digital Signal Processing" Spring Verlag, New York 1975. page-111.
264
if ((L-sb.floor(L)) > 0.0):
265
raise ValueError, "Length must be power of 2"
269
for i1 in range(1,L+1): #Iteration stage
271
for i2 in range(1,k2+1):
272
for i3 in range(1,k3+1):
274
temp1= x[i-1]; temp2 = x[j-1];
276
x[i-1] = temp1 - temp2;
277
x[j-1] = temp1 + temp2;
278
x[i-1] = temp1 + temp2;
279
x[j-1] = temp1 - temp2;
281
k1 = k1/2; k2 = k2*2; k3 = k3/2;
282
x = x*1.0/N; # Delete this line for inverse wht