Exponential decays - what do I do wrongly?

1 次查看(过去 30 天)
Hello,
The simplified setup is the following.
I have two superimposed decaying exponents with different but very close time constants. One of the decaying exponent is the result from a cross-talk, the other one is the signal of interest. The cross-talk decay is known. In the end, the goal is to determine the time constant of the signal of interest through curve fitting.
One way to separate the signal of interest is to simply subtract the known cross-talk decay from the combined signal. Easy but one needs to fiddle with counter, RAM where to store the cross-talk and start, stop indices during implementation.
Another approach is to remove the effect of the cross-talk by passing the combined signal through a filter, whose impulse response h(t) is the de-convolution of the known cross-talk.
(xTalk + Signal) * h(t) => Signal,
where * denotes convolution and h(t) = ifft( invert( fft(xtalk) ))
The implementation of the second approach is simple but there is a problem. The output of the above described process is not equal to Signal but to k x Signal, where k is a constant < 1. I really don't understand where k comes from the mathematics and how to ultimately calculate it. It is very important to understand the process so that I could effectively implement it in different circumstances.
Could please help me understand where k comes from and what is it due to?
Or maybe my thinking is not correct and I am doing something completely wrong.
Many thanks!
%%%%%%%%%%%%%%%%%%
Fs = 1e6; % sampling frequency
Ts = 1/Fs;
tEnd = 200e-6; % end time
t = 0:Ts:tEnd-Ts; % time vector
tau1 = 2.9e-6;
tau2 = 3.2e-6;
exp1 = exp(-t/tau1); % this is the cross-talk
exp2 = exp(-t/tau2); % this is the signal of interest
expo = exp1 + exp2; % combined signal
% Deconvolution in the frequency domain of exp1
fftExp1 = fft(exp1);
inv = 1 ./ fftExp1; % inverting the fft of the cross-talk
deconvExp1 = fftshift(ifft(inv)); % impulse response h(t) from the deconvolution of exp1. Shifted to the middle.
sanityCheck = conv(exp1, deconvExp1, 'same'); % must result in a dirac
stem(sanityCheck)
%% Note that the impulse response consists of only two taps with a high-pass effect.
result = conv(expo, deconvExp1(101:102), 'same'); % use only two taps
result = result(2:end-1); % remove the first and last samples due to filter priming
stem(result, 'r*'), hold on, stem(exp2(2:end-1), 'bo'), hold off % compare input and output
k = result ./ exp2(2:end-1) % this is the factor, whose origin I don't understand
  1 个评论
David Goodmanson
David Goodmanson 2020-7-7
编辑:David Goodmanson 2020-7-7
Hi George,
you can't deconvolve exp1 and get a meaningful result unless you have convolved exp1 with something to begin with. And here exp1 and exp2 were not convolved, they were added.

请先登录,再进行评论。

回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Spline Postprocessing 的更多信息

产品


版本

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by