I am puzzled by a filtering problem using fft(). I don't blame R.

I have a waveform y consisting of the sum of 2 sinewaves having freqs f1 and f2.
I do s = fft() of y.
Remove s's spike at freq=f2
Do inverse fft on s.
The resulting waveform still has a lot of f2 in it! But the filtering
should have removed it all.
What is going on, and how to fix??

Thanks very much for any help.
Bill


Below is code illustrating the problem.

n<-1024
#f1=2, f2=7
y<- 9*cos(2*pi*2.0*(1:n)/n) + 3*cos(2*pi*7.0*(1:n)/n)
plot(y,type='l')

s<-2*Re(fft(y))/n
plot(s[1:20], type='l')

#note freq[i] is s[i+1]; e.g. f=7.0 peak is at s[8]
coef<- 1-(((1:n)>8-1) & ((1:n)<8+1))
s2<- fft(y)*coef   # I have now removed f2

plot(2*Re(s2[1:20])/n, type='l')   #f2 is removed from spectrum

y2<-Re(fft(s2,inverse=TRUE)/n)  #now get back to time domain

plot(y,type='l')  #original waveform f1+f2
lines(y2,type='l',col='blue' )  #filtered waveform
lines(9*cos(2*pi*2.0*(1:n)/n), type='l',col='red' )  #what it should
look like -- f2 removed

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to