0
votes

I have a time varying signal (time,amplitude) and a measured frequency sensitivity (frequency,amplitude conversion factor (Mf)).

I know that if I use the center frequency of my time signal to select the amplitude conversion factor (e.g. 0.0312) for my signal I get a max. converted amplitude value of 1.4383.

I have written some code to deconvolve the time varying signal and known sensitivity (i.e. for all frequencies).

where Pt is the output/converted amplitude and Mf is amplitude conversion factor data and fft(a) is the fft of the time varying signal (a).

I take the real part of the fft(a):

xdft = fft(a);
xdft = xdft(1:length(x)/2+1); % only retaining the positive frequencies
freq = Fs*(0:(L/2))/L; 

where Fs is sampling frequency and L is length of signal.

convS = real(xdft).*Mf;

assuming Mf is magnitude = real (I don't have phase info). I also interpolate

Mf=interp1(freq_Mf,Mf_in,freq,'cubic');

so at the same interrogation points as freq.

I then reconstruct the signal in time domain using:

fftRespI=complex(real(convS),imag(xdft));

pt = ifft(fftRespI,L,'symmetric')

where I use the imaginary part of the fft(a).

The reconstructed signal shape looks correct but the amplitude of the signal is not.

If I set all values of Mf = 0.0312 for f=0..N MHz I expect a max. converted amplitude value of ~1.4383 (similar to if I use the center frequency) but I get 13.0560.

How do I calibrate the amplitude axis? i.e. how do I correctly multiply fft(a) by Mf?

Some improved understanding of the y axis of the abs(magnitude) and real FFT would help me I think...

thanks

1
Multiplying the real part of a fft signal by a magnitude doesn't have a lot of sense as it is a mix between the amplitude and the phase information. Have you tried multiplying directly the coefficients of xdft with your weights Mf. This would make a lot more sense, as it is the same process than applying a frequency varying filter to a fft signalBillBokeey
Thanks I understand your point but not sure what you mean by 'coefficients'?2one

1 Answers

1
votes

You need to re-arrange the order of your weights Mf to match the MATLAB's order for the frequencies. Let's say you have a signal

N=10;
x=randn(1,N);
y=fft(x);

The order of the frequencies in the output y is

[0:1:floor(N/2)-1,floor(-N/2):1:-1] = [0 1 2 3 4 -5 -4 -3 -2 -1]

So if your weights

Mf = randn(1,N)

are defined in this order: Mf == [0 1 2 3 4 5 6 7 8 9], you will have to re-arrange

Mfshift = [Mf(1:N/2), fliplr(Mf(2:(N/2+1)))];

and then you can get your filtered output

z = ifft(fft(x).*Mshift);

which should come out real.