obtain the Impulse response from a frequency response
95 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Hi everybody,
I need some help to get me started on this one:
I have a transfer function (a frequency response) that is generated by two datasets. I need to convert this frequency response (FR) to the time domain (I guess by using the ifft function in Matlab) in order to obtain the impulse response (IR) and see how long it is in seconds.
What confuses me is if an impulse (IR) has N samples then the fft would have N/2+1 samples (please correct me if I am wrong). The rest of the samples in the FR are disregarded as they are symmetrical.
Now, if I have the FR I could go back to IR by ifft. But that would give me only N/2+1 samples. I need N for the impulse response. How do I deal with this?
Moreover, how can I determine the sampling frequency (fs) of my FR in order to calculate the duration of the IR in seconds? My FR expands from 20 to 10000 Hz with a step of 20 Hz. Is it in this case that fs=20?
thank you for your patience
0 Kommentare
Akzeptierte Antwort
Dr. Seis
am 14 Mai 2012
N = 1000; % Number of samples
df = 20; % Frequency increment (in Hertz)
Nyq = 10000; % Nyquist Frequency (in Hertz)
Two ways of determining Fs, but both should be same answer:
Fs = 2*Nyq; % Sampling frequency (20000 samples/sec)
Fs = N*df; % Sampling frequency (20000 samples/sec)
The real part of your frequency response is symmetrical (i.e., the real part of your FR is symmetrical about 0 frequency). The imaginary part of your frequency response is anti-symmetrical (i.e., the imaginary part of your FR is symmetrical about 0 frequency if you were to multiply one side by -1).
If you make sure you have frequency response amplitudes that corresponds to frequencies:
f = -Nyq : df : Nyq-df;
Then you can convert it into the timedomain using:
IR_data = ifft(ifftshift(FR_data));
Though there might be some scaling factor you will need to multiply the ifft result to (I think just multiply the result by Fs).
*******************
EDIT 05/14/2012
*******************
If you only have real, positive frequency data... then that's all you got. Imaginary parts are all zero, so that is fine... you have data with zero phase. You will still need to create a symmetrical dataset (i.e., "FR_data"). In order to create your "FR_data" dataset, you will take your current dataset, say "FR_positive_frequency_only" and do this:
FR_data = zeros(1,1000);
FR_data(2:501) = FR_positive_frequency_only;
FR_data(502:1000) = fliplr(FR_postive_frequency_only(1:end-1));
These amplitudes correspond to frequencies according to:
f_shift = ifftshift(f);
Your impulse response dataset is then just:
IR_data = ifft(FR_data); % No need to use ifftshift when constructing FR_data like above
Here the amplitude at 0 frequency (i.e., FR_data(1)) is just set to zero. Note: if your "FR_positive_frequency_only" dataset is a column matrix, then use flipud instead of fliplr.
0 Kommentare
Weitere Antworten (1)
Siehe auch
Kategorien
Mehr zu Pulsed Waveforms finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!