Convolución circular MOD-N

7

Cómo encontrar la convolución circular MOD-2 para las dos secuenciash=[1,3,2,1]y .x=[1,1,2,1,3,2,1,2]

Sé que la respuesta es de matlab pero no sé cómo encontrarla gráfica o matemáticamente7 0

Saleh Khalaf
fuente

Respuestas:

6

Escribir h(z)=1+3z2z2+z3y calcule , es decir, divida por y tome solo el resto. Si bien esto parece muy complicado, si lo piensa un poco verá que todo lo que está haciendo es dividir en y y agregando los vectores más cortos para obtener . Repita para para agregar cuatro vectores de longitud para obtener h(z)mod(z21)h(z)z21[13 21][13][21][34]x=[1 1 213212]2[34] . Presumiblemente, esto no es demasiado difícil de hacer en MATLAB, aunque no estoy lo suficientemente familiarizado con la sintaxis para sugerir comandos específicos. Luego, calcule la convolución cíclica de y[34][34] preferiblemente sin invocar funciones MATLAB. El resultado es

[{(3)×3+4×4}{(3)×4+4×3}]=[70]

Matemáticamente, lo que está haciendo es calcular que se puede hacer de manera sencilla al encontrar primero usando FFT y qué ha seguido por el computación (esto efectivamente divide el vector largo en piezas cortas y las agrega), o más simplemente calculando primero y (cortar en vectores más cortos y agregarlos) y luego calcular la convolución cíclica h(z)x(z)mod(z21)h(z)x(z)mod(z21)h^(z)=h(z)mod(z21)x^(z)=x(z)mod(z21)z^(z)x^(z)mod(z21) que es fácil de hacer.

Chop-add-convolve es más fácil que convolve-chop-add

Dilip Sarwate
fuente
1
Matlab para "chop add convolve" sería: ifft (fft (sum (reshape (x, 2, length (x) / 2), 2)). * Conj (fft (sum (reshape (h, 2, length (h ) / 2), 2))))
pichenettes
Gracias por sugerir el código chop-add, pero no estoy de acuerdo con el ifft (parte fft. La convolución cíclica de dos vectores de longitud debe calcularse directamente sin invocar ffts y similares. Begin apenas necesita el mecanismo formal de ffts y iffts. El módulo- para valores mayores de es una cuestión diferente; para el módulo- , es una exageración.2
(a+bz)(c+dz)mod(z21)=(ac+(ad+bc)z+bdz2)mod(z21)=(ac+bd)+(ad+bc)z
NN2
Dilip Sarwate
sí, hacer la convolución circular con ifft (fft (). * conj (fft ())) es útil solo para un N. mayor
pichenettes
1
@pichenettes El enfoque fft calcularía a+b,ab,c+d,cd (fft), multiplica e=(a+b)(c+d),f=(ab)(cd), y luego encuentre el resultado de convolución como (e+f)/2, (ef)/2 usando dos mults, dos scalings, seis adiciones, mientras que el cálculo directo ac+bd,ad+bcnecesita cuatro mults y dos adiciones. Si se codifica directamente, está cerca de un lanzamiento, pero creo que el método directo tiene una ligera ventaja. Si se toman en cuenta los gastos generales de las llamadas de subrutina de MATLAB, el método directo es más rápido. Pero, por supuesto, todo esto es una comparación de los cacahuetes en el tiempo de cálculo en comparación con cualquier otra cosa que se esté haciendo.
Dilip Sarwate
3

Un enfoque es "volver a envolver" una convolución circular de tamaño completo:

sum(reshape(ifft(fft(x, 8) .* conj(fft(h, 8))), 2, 8 / 2), 2)

Otra implementación es diezmar directamente la FFT:

N = 2;
Xf = fft(x); Xf = Xf(1:length(Xf) / N:end);
Hf = fft(h); Hf = Hf(1:length(Hf) / N:end);
ifft(Xf .* conj(Hf))

Si lo que desea reproducir es el comportamiento de cconv desde matlab, podría ser mejor simplemente mirar su código fuente en los archivos de matlab :)

pichenettes
fuente