Convert Time Domain Signal Data into Frequency Domain, How to handle the imaginary terms?

Asked by Tan on 2 Jun 2012
Latest activity Commented on by Tan on 11 Jun 2012

Hi Everyone,

I'm a beginner of MATLAB. I'm having some problems of converting time domain signal into frequency domain.

In time domain, is this the way to plot the graph?

value = [42007935 111212895 184546560 238219725 238219725 184546560 111212895 42007935]; time = [0, 1, 2, 3, 4, 5, 6, 7, 8 ]; plot (time, value);

Then, when i want to plot it in frequency domain, i use the following codes:

fft_Conv = fft (value); plot (time, fft_Conv);

I get a warning: Warning: Imaginary parts of complex X and/or Y arguments ignored.

Could anyone guide me how to plot signal in time domain and frequency domain?

Regards, HJ.C

0 Comments

Tan

Products

No products are associated with this question.

3 Answers

Answer by Wayne King on 2 Jun 2012
Accepted answer

You want to plot the magnitude and phase separately for the complex-valued data. Think of the polar form of a complex number. A few other things: you want to create a frequency vector to use in plotting the frequency domain data (DFT). You may or may not want to center 0 frequency in your Fourier transform, I do this below. Because the mean of your time data is so large, you are going to get a large 0 frequency magnitude in your Fourier transform.

     value = [42007935 111212895 184546560 238219725 238219725 184546560 111212895   42007935];
     time = 0:7;
     stem(time,value,'markerfacecolor',[0 0 1])
     title('Time Data'); xlabel('Time'); ylabel('Amplitude');
     dftvalue = fft(value);
     freq = -pi:(2*pi)/length(value):pi-(2*pi)/length(value);
     figure;
     stem(freq,abs(fftshift(dftvalue)),'markerfacecolor',[0 0 1])
     title('Magnitude of DFT'); xlabel('Frequency'); ylabel('Magnitude');
     figure;
     stem(freq,angle(fftshift(dftvalue)),'markerfacecolor',[0 0 1])
     title('Phase of DFT');
     xlabel('Frequency'); ylabel('Magnitude');
     % or stem(freq,unwrap(angle(dftvalue)),'markerfacecolor',[0 0 1])  

7 Comments

Wayne King on 2 Jun 2012

No, not unless your system is a linear shift-invariant system and the input signal was an impulse. Under those circumstances, the filtered signal would be the impulse response and you could get the frequency response.

Tan on 2 Jun 2012

The values in the value array are actually the result of an impulse with 1V passing through a low pass filtered with frequency coefficients shown below.

Numerator: Denominator:
[3.91719822748777E-02, [1.000]
0.103629842929331,
0.171922134825388,
0.221881476438683,
0.221881476438683,
0.171922134825388,
0.103629842929331,
3.91719822748777E-02]

I intend to see if the frequency response of the impulse after pass through the filter really response like what i expect.

Tan on 2 Jun 2012

Numerator:
[3.91719822748777E-02,
0.103629842929331,
0.171922134825388,
0.221881476438683,
0.221881476438683,
0.171922134825388,
0.103629842929331,
3.91719822748777E-02]

Denominator:
[1.000]

Wayne King
Answer by Wayne King on 2 Jun 2012

Then you want to use freqz()

     b = [3.91719822748777E-02, 
     0.103629842929331, 
     0.171922134825388, 
     0.221881476438683, 
     0.221881476438683, 
     0.171922134825388, 
     0.103629842929331, 
    3.91719822748777E-02];
    [H,W] = freqz(b,1);
    plot(W,20*log10(abs(H)))

4 Comments

Tan on 2 Jun 2012

Because i'm actually want to prove if the filtered impulse is following/producing output based on the filter behavior (coefficient). Can we do that?

Wayne King on 2 Jun 2012

If you feed it the impulse AND the system is LTI, then yes, the Fourier transform of the impulse response is the frequency response. Just keep in mind that by giving me that b vector above you are asserting that is the impulse response and that system has a finite impulse response

Tan on 2 Jun 2012

Yes. My system a linear shift-invariant system and the input signal is an impulse.
So if i want to plot the response out when we are just given:

value = [42007935 111212895 184546560 238219725 238219725 184546560 111212895 42007935];

How should i do?
I'm sorry if i ask a repeating question, because i have vague idea on this

Wayne King
Answer by Wayne King on 2 Jun 2012

Then you are telling me that

   b = [42007935 111212895 184546560 238219725 238219725 184546560 111212895   42007935];
   % so
   [h,f] = freqz(b,1);
   plot(f,20*log10(abs(h))); 

Of course if you know the sampling frequency, then you can use that in freqz() to get the response in Hz.

9 Comments

Tan on 10 Jun 2012

Hi Ryan,

I encounter some problem while plotting the graph

%Plot impulse before filtering in time and frequency domain
b = [3.91719822748777E-02,
0.103629842929331,
0.171922134825388,
0.221881476438683,
0.221881476438683,
0.171922134825388,
0.103629842929331,
3.91719822748777E-02];
time = 0:7;
stem(time,b,'markerfacecolor',[0 0 1])
title('Time Data'); xlabel('Time(s)'); ylabel('Amplitude');
dftb = fft(b);
freqb = -pi:(2*pi)/length(b):pi-(2*pi)/length(b);
figure;

stem(freqb,abs(fftshift(dftb)),'markerfacecolor',[0 0 1])
title('Magnitude of DFT'); xlabel('Frequency(Hz)'); ylabel('Magnitude');
figure;

stem(freqb,angle(fftshift(dftb)),'markerfacecolor',[0 0 1])
title('Phase of DFT');
xlabel('Frequency(Hz)'); ylabel('Magnitude');

%Plot impulse after filtering in time and frequency domain
value = [42007935 111212895 184546560 238219725 238219725 184546560 111212895 42007935];
time = 0:7;
stem(time,value,'markerfacecolor',[1 0 0])
title('Time Data'); xlabel('Time(s)'); ylabel('Amplitude');
dftvalue = fft(value);
freq = -pi:(2*pi)/length(value):pi-(2*pi)/length(value);
figure;

stem(freq,abs(fftshift(dftvalue)),'markerfacecolor',[1 0 0])
title('Magnitude of DFT'); xlabel('Frequency(Hz)'); ylabel('Magnitude');
figure;

stem(freq,angle(fftshift(dftvalue)),'markerfacecolor',[1 0 0])
title('Phase of DFT');
xlabel('Frequency(Hz)'); ylabel('Magnitude');
% or stem(freq,unwrap(angle(dftvalue)),'markerfacecolor',[0 0 1])

%Plot two sets of data in one graph (time domain)
stem(time,value,'markerfacecolor',[1 0 0],'r',time,b,'markerfacecolor',[0 0 1],'b')
stem(freq,abs(fftshift(dftvalue)),'markerfacecolor',[1 0 0],'r',freqb,abs(fftshift(dftb)),'markerfacecolor',[0 0 1],'b')
stem(freq,angle(fftshift(dftvalue)),'markerfacecolor',[1 0 0],'r',freqb,angle(fftshift(dftb)),'markerfacecolor',[0 0 1],'b')

Tan on 10 Jun 2012

The last three row of codes, is it something wrong there?

Tan on 11 Jun 2012

Hi, i manage to plot the graph. thanks :)

Wayne King

Contact us