From: carlierm on 3 Jan 2010 21:10 >Tim Wescott wrote: >> On Sun, 03 Jan 2010 08:29:00 -0600, carlierm wrote: >> >>> Hi >>> >>> I have a signal in the time domain, and I need to perform some changes >>> in the spectrum of magnitude of such signal, and then I want to >>> reconstruct the signal and take it to the time domain again. The problem >>> I have is that i cannot get the signal in the time domain after the >>> modifications. When I take ifft, I get a vector of complex numbers, and >>> I expect a vector or real numbers. The code I have is as follows: >>> >>> Fs=1024; >>> t=0:1/Fs:1; >>> x=sin(2*pi*t*200); >>> y=fft(x); >>> mx=abs(y); >>> ma=angle(y); >>> [C,I]=max(mx); >>> mx(I)=100; >>> for i=1:length(y) >>> y4(i)=mx(i)*cos(ma(i))+ j*mx(i)*sin(ma(i)); >>> end >>> y6=ifft(y4); >>> >>> I will appreciate any help. >>> >>> Monica >> > >Consider this: > >If you fft a real time sequence then the real part is even and the >imaginary part is odd. > >When you fft any sequence then the resulting sequence starts with an >index of zero and ends with an index of N-1 - relative frequency - if >the original sequence is a time sequence. And, you may assume that the >value at N would be the same as the value at zero - as you may consider >that it starts to repeat at that point. You may visualize this if you >put the data on a circular axis (i.e. the axis is a circle) instead of a >linear one. > >Because the real part is even, it mirrors around Fs/2 or around N/2. If >the number of samples is even then there is a sample at that point and >it is the N/2+1th sample and it must be purely real because the >imaginary part is odd thus zero at that point. If the number of samples >is odd then there is no sample at Fs/2. >Because of the mirroring, the real part of the samples show up in equal >pairs around zero and the imaginary parts of the samples show up in >equal (but opposite sign) around zero. > >The magnitude is always even. Because of this, the magnitude is >symmetrical about zero AND about Fs/2. > >I note that you changed the magnitude at a single sample point. >Because of the above, what about the magnitude at the mirror image >point? By changing a single sample you have perforce changed the >evenness of the magnitude and I should say the real part. The resulting >ifft can therefore *not* be real. > >Without solving the entire problem for you, I suggest you first make the >change at both I and at length(y)-I ... check my math here to keep the >magnitude an even function. Whether this guarantees that the real part >remains even and the imaginary part remains odd I leave as an important >exercise. > >Also, how can you be sure that the conversion from magnitude and phase >back to real and imaginary is working OK. Have you considered phase >wrap first? i.e. what happens when the phase goes beyond 2pi? > >P.S. Changing a single pair of mirrored samples (real and imaginary >now...) in frequency (which is equivalent to multiplying by a pair of >samples of selected value) is the same as convolving in time by a >sinusoid. Is that what you're trying to do? > >Fred > Thank you very much Fred. You were right; I did the change at both points as you suggested and it worked. Thanks again. Monica
From: carlierm on 3 Jan 2010 21:12 >On Sun, 03 Jan 2010 08:29:00 -0600, carlierm wrote: > >> Hi >> >> I have a signal in the time domain, and I need to perform some changes >> in the spectrum of magnitude of such signal, and then I want to >> reconstruct the signal and take it to the time domain again. The problem >> I have is that i cannot get the signal in the time domain after the >> modifications. When I take ifft, I get a vector of complex numbers, and >> I expect a vector or real numbers. The code I have is as follows: >> >> Fs=1024; >> t=0:1/Fs:1; >> x=sin(2*pi*t*200); >> y=fft(x); >> mx=abs(y); >> ma=angle(y); >> [C,I]=max(mx); >> mx(I)=100; >> for i=1:length(y) >> y4(i)=mx(i)*cos(ma(i))+ j*mx(i)*sin(ma(i)); >> end >> y6=ifft(y4); >> >> I will appreciate any help. >> >> Monica > >You don't say what tool you're doing this in; I assume it's Matlab, but >it could as easily be Octave, Scilab, or something else yet. Letting us >know would help. > >Assuming that it's one of the three that I mentioned, here's several >things to check: > >First, check the magnitude of the complex part of your answer. Scilab, >at least, nearly always decides that the return from an ifft is complex, >but the complex part is often scraping the limit of computational >accuracy. When you've got a real part with a maximum magnitude of 100, >and an imaginary part with a maximum magnitude of 10^-15, you can often >safely assume that you've got a vector of reals, with some round-off >error that happens to be complex. > >Then, just to make sure that the world has not gone insane, see what you >get when you take ifft(fft(x)). > >I _think_ that what you're doing by separating phase and magnitude is OK, >but you should probably also try commenting out the mx(I) = ... line, and >see what result you get. > >I can't think of anything else. Good luck, let us know what you find. > >-- >www.wescottdesign.com > I am using matlab. Thanks for your comments.
First
|
Prev
|
Pages: 1 2 Prev: PhD s from Convolution Integral Thread Next: extended kalman filter going berserk |