/ / Encontrar el núcleo de convolución en matlab - matlab, procesamiento de señales

Encontrar el kernel de convolución en matlab - matlab, procesamiento de señal

Tengo dos vectores de datos espaciales (cada uno sobre2000 elementos de longitud). Uno es una versión enrevesada del otro. Estoy tratando de determinar el núcleo que produciría tal convolución. Sé que puedo hacer esto al encontrar la transformada inversa de Fourier de la relación de las transformadas de Fourier de los vectores de salida y entrada. De hecho, cuando hago esto obtengo más o menos la forma que esperaba. Sin embargo, mi vector kernel tiene la misma dimensionalidad que los dos vectores de entrada cuando en realidad la convolución solo usaba aproximadamente un quinto (~ 300-400) de los puntos. El hecho de que estoy obteniendo la forma correcta pero el número incorrecto de puntos me hace pensar que no estoy usando las funciones ifft y fft de manera bastante correcta. Parece que si realmente estuviera haciendo lo correcto, esto debería suceder naturalmente. Por el momento simplemente estoy haciendo;

FTInput = fft(in);
FtOutput = fft(out);
kernel = ifft(FtOutput./FTInput).

¿Es correcto y depende de mí interpretar el vector de salida correctamente o he simplificado demasiado la tarea? Estoy seguro de que es lo último, pero no estoy seguro de dónde.

Gracias

Respuestas

2 para la respuesta № 1

Estás haciendo las cosas correctamente, esto no es un error.

El problema de estimar un filtro de convoluciónLos datos limpios y convolucionados son MUY DUROS. Dados los datos "agradables", puede obtener la forma correcta, pero recuperar el verdadero soporte del filtro de convolución (es decir, obtener ceros donde deberían estar) NO va a suceder naturalmente.


2 para la respuesta № 2

Creo que su "" problema "" proviene del relleno inherente necesario para la convolución discreta que está descuidando

Al dividir en fourier, asumes tula convolución se realizó con un relleno cíclico en el espacio (o que su convolución se realizó por multiplicación en fourier, ambos son equivalentes) pero si su convolución se calculó en el dominio espacial, lo más probable es que se use un relleno cero.

s=[1 2 3 4 5] //signal

f=[0 1 2 1 0] //filter

s0=s *conv0* f=[4 8 12 16 14] //convolution with zero padding in spatial domain, truncated to signal length
sc=s *convc* f=[9 8 12 16 15] //convolution with cyclic padding in spatial domain, truncated to signal length

S,S0,Sc, the ffts of s,s0,sc

approx0=ifft(S0./S)=[-0.08 1.12 2.72 -0.08 -0.08]

approxc=ifft(Sc./S)=[0 1 2 1 0]