# Mirror or UnMirror a Wave

These functions can be used in FFT or convolution to avoid Gibbs oscillations at endpoints. The wave is mirrored or unmirrored at its start (at = 0) or end (at = 1). For FFT, use odd = 0 to get an even number of points in return wave.

Applications
--
DoMirror(yw, 0)
UndoMirror(yw, 0)
--
DoMirror(yw, 0, odd=0)
… do FFT operation on yw -> yw_fft
… smooth via subtraction of noise component in Fourier domain
… do inverse FFT operation on yw_fft -> yw
UnDoMirror(yw, 0, odd=0)

Function DoMirror(yw, at, [odd])
wave/D yw
variable at, odd

variable nptso = numpnts(yw), nptsn

odd = ParamIsDefault(odd) ? 1 : 0

nptsn = 2*nptso + 1*odd
Duplicate/FREE yw, ywtemp
Redimension/N=(nptsn) yw
switch(at)
case 0:     // start
yw[0,nptso-1] = ywtemp[nptso - 1 - p]
yw[nptso] = ywtemp[0]
yw[nptso+1*odd,nptsn-1] = ywtemp[p - 1*odd - nptso]
break
case 1:     // end
yw[nptso] = ywtemp[nptso-1]
yw[nptso+1*odd,nptsn-1] = ywtemp[nptsn - p - 1]
break
endswitch
return 0
end

Function UnDoMirror(yw, at, [odd])
wave/D yw
variable at, odd

odd = ParamIsDefault(odd) ? 1 : 0

variable nptso = numpnts(yw), nptsn

nptsn = (nptso - 1*odd)/2
make/FREE/N=(nptsn) ywtemp
ywtemp = yw[p]
Redimension/N=(nptsn) yw
switch(at)
case 0:     // start
yw = ywtemp[nptsn - 1 - p]
break
case 1:     // end
break
endswitch
return 0
end

Forum

Support

Gallery