DSPRelated.com
Forums

Equaling multiplication and convolution of a signal

Started by m26k9 March 16, 2009
Hello,

I am not sure if this is possible, but I have signals x(t) and y(t), and I
need to find a signal z(t) that hold the following property:

x(t).y(t) = x(t)*z(t);

Multiplication of x(t) and y(t) equals to the cyclic convolution between
x(t) and z(t). Is there any mathematical approach to find z(t)? 

Thank you.
On 16 Mar, 06:06, "m26k9" <maduranga.liyan...@gmail.com> wrote:
> Hello, > > I am not sure if this is possible, but I have signals x(t) and y(t), and I > need to find a signal z(t) that hold the following property: > > x(t).y(t) = x(t)*z(t); > > Multiplication of x(t) and y(t) equals to the cyclic convolution between > x(t) and z(t). Is there any mathematical approach to find z(t)?
1) Compute u = x*y 2) Use system identification techniques to find a z such that x (*) z = u It may or may not work. Rune
Rune Allnor wrote:
> On 16 Mar, 06:06, "m26k9" <maduranga.liyan...@gmail.com> wrote: > > > Hello, > > > I am not sure if this is possible, but I have signals x(t) and y(t), and I > > need to find a signal z(t) that hold the following property: > > > x(t).y(t) = x(t)*z(t); > > > Multiplication of x(t) and y(t) equals to the cyclic convolution between > > x(t) and z(t). Is there any mathematical approach to find z(t)? > > 1) Compute u = x*y > 2) Use system identification techniques to find a z such that > &#4294967295; &#4294967295;x (*) z = u > > It may or may not work.
It is simple, because the OP want to inverse filter with respect to cyclic convolution. Then the inverse filtering can be done using DFT: z = ifft( fft(u) ./ fft(x) ) Assuming that x is invertible (ie. abs(fft(x)) has no zero entry). Regards, Andor
Thank you very much Rune and Andor.
I will try that method. Being able to use FFT is a plus point.

Cheers.
On 17 Mar, 10:45, "m26k9" <maduranga.liyan...@gmail.com> wrote:
> Thank you very much Rune and Andor. > I will try that method. Being able to use FFT is a plus point.
Don't thank anyone until you've tried it. Keep in mind that system identification and deconvolution are among the hardest problems in DSP. The spectrum division is the naive method everybody uses but which almost never works. There is no guarantees that any of this will give useful results, even if you try more elaborate methods. Rune
Thank you Rune.
I tried a few simple examples using 'deconv' of Matlab. But doesnt seem to
give what I want. 
I think it's a problem of the dimensions and linear convolution. Probably
will be able to work around. Thank you.
>Thank you Rune. >I tried a few simple examples using 'deconv' of Matlab. But doesnt seem
to
>give what I want. >I think it's a problem of the dimensions and linear convolution.
Probably
>will be able to work around. Thank you. >
P.S: The deconv worked properly after zero padding. It seems to be working. Thank you very much for the help. Cheers.
m26k9 wrote:
> Thank you very much Rune and Andor. > I will try that method. Being able to use FFT is a plus point.
It really depends on whether you have linear or circular convolution. To deconvolve circular convolution, the DFT approach I outlined is not an approximation but the exact solution. Consider the problem of trying to find z, given x and u, such that u = x * z, (1) where * denotes circular convolution. Note that you can write (1) as a system of linear equations u = X z, (2) where the circulant matrix X contains cyclically shifted copies of x on each row. In Matlab, X = gallery('circul',x). Solving (2) gives you z, ie. z = X^-1 u. The reason you can do this with the DFT the way I described above is that all circulant matrices are diagonalized by the DFT matrix D, ie. X_d = D* X D is diagnoal, and it can be shown [1] that in fact X_d = diag( fft(x) ). Thus, if X is invertible you have z = X^-1 u = (D* X D)^-1 u = D* X_d^-1 D u Now notice that D u = fft(u), X_d^-1 = diag( fft(x).^1 ) and thus pops out z = ifft( fft(u) ./ fft(x) ). Regards, Andor [1] http://www-ee.stanford.edu/~gray/toeplitz.pdf
Thank you very much Andor.
Yeah it seems not working for linear convolution.
I tried the following simple code to see if it works but doesn't seem to
get the answer.

I want: x*y = z; and trying to find y;

x = randint(8,1,[1, 5]) + i*randint(8,1,[1, 5]);
X = fft(x,16);

z = zeros(16,1);
z(1,1) = 1;
Z = fft(z);

Y = Z./X;
y = ifft(Y);


I will try your code.
Thank you very much Andor.