Interpolación de magnitud de transformada de Fourier discreta (DFT)

7

Por ejemplo, para la búsqueda de la frecuencia pico, parece válido usar métodos de interpolación de banda limitada en los contenedores DFT complejos, o por separado en sus partes reales e imaginarias y para calcular las magnitudes o las magnitudes al cuadrado de los resultados. Pero, ¿qué hay de la interpolación limitada en banda de las magnitudes de los contenedores (no creo que sea válido), o sus magnitudes al cuadrado (tal vez válidas)? Por válido quiero decir que los valores perfectamente interpolados deben ser iguales a los encontrados al calcularlos a partir de un DFT más grande de una versión con relleno de cero de la señal del dominio del tiempo.

El primer enfoque garantiza un resultado no negativo, a diferencia de los otros, si la interpolación no es perfecta, consulte esta pregunta sobre la interpolación limitada de banda positiva o no negativa .

Olli Niemitalo
fuente
Hola Olli, ¿es una pregunta?
Robert Bristow-Johnson
@ robertbristow-johnson Sí, es ... la parte del "qué tal". Aunque tengo mis conjeturas allí.
Olli Niemitalo
1
Por cierto, el gaussiana es AN función propia del Transformada de Fourier. En realidad, hay un número infinito de funciones propias y es bastante fácil construir una función propia.
Robert Bristow-Johnson
1
@ robertbristow-johnson Obteniendo algo tangencial, pero ¿qué más es?
Olli Niemitalo
1
cualquier función de simetría par más la transformación de Fourier de sí misma (con f reemplazadas con t) es una función propia de la Transformada de Fourier.
robert bristow-johnson

Respuestas:

4

Los puntos interpolados de la DFT se pueden calcular utilizando un producto de puntos de algunas muestras alrededor de la región del pico con un vector de interpolación precalculado. El vector de interpolación está determinado por la ubicación de la muestra interpolada deseada, teniendo en cuenta la cantidad de relleno cero requerido, etc., etc.

Esta técnica y la metodología para calcular los vectores de interpolación se tratan en el Apéndice B de este documento:

http://ericjacobsen.org/FTinterp.pdf

Espero que ayude un poco.

Eric Jacobsen
fuente
Gracias Eric, es bueno ver que también has notado en la interpolación de magnitud que "La no linealidad en la detección de magnitud da como resultado una señal que está esencialmente submuestreada". Muestro en mi respuesta que la magnitud al cuadrado no se submuestrea cuando la señal del dominio del tiempo ha sido rellenada con ceros hasta 2x de longitud. Desafortunadamente, no todas las ecuaciones en el pdf se muestran correctamente en Chrome, por ejemplo, la ecuación. 3.5.
Olli Niemitalo
1
No se submuestrea hasta que se detecta la magnitud, por lo que interpolar los coeficientes complejos para obtener el coeficiente interpolado complejo y luego calcular la magnitud (o la magnitud al cuadrado) evita ese problema.
Eric Jacobsen
¡Convenido! El pdf funciona bien en Edge.
Olli Niemitalo el
5

Primero una demostración de que los cuadrados de ambos

[,0,0,1,1,0,0,] and[,0,0,1,1,0,0,]

igual

[,0,0,1,1,0,0,] and

pero los cuadrados de sus interpolaciones sinc difieren (Fig. 1):

Cuadrados de interpolaciones sinc
Figura 1. Cuadrados de interpolaciones sinc de [1,1] (azul) y [1,1] (rojo).

Esto demuestra que, en general, no es posible recuperar el cuadrado de una señal de banda limitada de sus muestras uniformes tomadas a la frecuencia de muestreo crítica de la señal de banda limitada.


Probemos diferentes enfoques de interpolación en Octave. El estándar de oro de la interpolación de banda limitada es DFT – zero-pad – DFT:

>> format free
>> x = [1 2 3];
>> y = [1 2 3  0 0 0];
>> abs(fft(x))
ans =

 6 1.73205 1.73205

>> abs(fft(y))
ans =

 6 4.3589 1.73205 2 1.73205 4.3589

El último conjunto de números son los valores de magnitud calculados a partir de intervalos de dominio de frecuencia perfectamente interpolados. Intentemos interpolar la magnitud en su lugar:

>> fft(fftshift(horzcat([0 0], fftshift(ifft(abs(fft(x)))), [0])))
ans =

 6 4.57735 1.73205 0.309401 1.73205 4.57735

Parece un poco fuera de lugar. Ahora intentemos interpolar la magnitud al cuadrado :

>> fft(fftshift(horzcat([0 0], fftshift(ifft(abs(fft(x)).^2)), [0])))
ans =

 36 25 3 -8 3 25

>> sqrt(ans)
ans =

 (6,0) (5,0) (1.73205,0) (0,2.82843) (1.73205,0) (5,0)

No solo está desactivado, sino que también sqrt()devuelve un número complejo para un valor interpolado negativo. Entonces, ¿es la única forma válida de interpolar los valores bin?

Demos una oportunidad más, al tratar de interpolar datos de dominio de frecuencia muestreados por un factor de 2. Debido a la transformación de longitud par, esto requiere duplicar la "muestra de Nyquist", por lo que me disculpo si el código es difícil de leer.

>> z = [1 2 3  0 0 0  0 0 0  0 0 0];
>> abs(fft(z))
ans =

 6 5.55485 4.3589 2.82843 1.73205 1.77302 2 1.77302 1.73205 2.82843 4.3589 5.55485

Lo anterior es lo que queremos. Intentemos interpolar 2 veces la magnitud de muestreo :

>> fftshift(horzcat([0 0 0], fftshift(ifft(abs(fft(y)))), [0 0 0]))
ans =

 3.36365 1.10447 0.318175 0 0 0 0 0 0 -0.208949 0.318175 1.10447

>> ans(4) = ans(length(ans)-2)
ans =

 3.36365 1.10447 0.318175 -0.208949 0 0 0 0 0 -0.208949 0.318175 1.10447

>> fft(ans)
ans =

 5.79105 5.59483 4.56785 2.7273 1.5231 1.76882
 2.20895 1.76882 1.5231 2.7273 4.56785 5.59483

Eso todavía está apagado. Intentemos interpolar 2 veces la magnitud al cuadrado muestreada :

>> fftshift(horzcat([0 0 0], fftshift(ifft(abs(fft(y)).^2)), [0 0 0]))
ans =

 14 8 3 0 0 0 0 0 0 1.18424e-15 3 8

>> ans(4) = ans(length(ans)-2)
ans =

 14 8 3 1.18424e-15 0 0 0 0 0 1.18424e-15 3 8

>> sqrt(fft(ans))
ans =

 6 5.55485 4.3589 2.82843 1.73205 1.77302 2 1.77302 1.73205 2.82843 4.3589 5.55485

¡Ahora funciona perfecto! El mensaje principal es tomar una muestra ascendente (dominio cero del dominio del tiempo) al menos por un factor de dos antes de intentar interpolar en el dominio de frecuencia e interpolar la magnitud al cuadrado en lugar de la magnitud. Funciona porque tomar la magnitud al cuadrado es lo mismo que multiplicar cada valor bin por su conjugado complejo. La conjugación compleja conserva el ancho de banda de la función de banda limitada representada por los datos, por lo que la multiplicación duplica el "ancho de banda del dominio del tiempo" porque es equivalente a la convolución del dominio del tiempo. Tenga en cuenta que al elegir el método de interpolación, la magnitud al cuadrado muestreada 2x todavía se muestrea críticamente, por lo que un sobremuestreo adicional debería facilitar mucho la interpolación precisa.

¡Ya respondí mi propia pregunta, pero aceptaré más información como respuesta!

PD: Acabo de descubrir que también existe interpft, lo que hace la interpolación con menos sintaxis.

Utilizando información adicional

La interpolación se vuelve más fácil o incluso exacta con información adicional sobre los datos, por ejemplo, que es un sinc cuadrado desplazado en el tiempo muestreado críticamente. En ese caso, dadas las dos muestrasα justo antes y γ justo después de la muestra más grande, el tiempo 1<d<1 del pico se puede calcular por:

d={0if α=γ,11p2p,p=γαα+γotherwise,

con significa que el sinc se desplaza exactamente al tiempo de la muestra más grande. La misma interpolación se puede hacer a la mitad de la frecuencia de muestreo, que es la frecuencia de muestreo crítica de la función subyacente, cuya magnitud es igual a la de un sinc desplazado en el tiempo, con las dos muestras sucesivas de mayor valor y del cuadrado del valor absoluto de la función subyacente:d=0αβ

0d1d={0if β=0,1if α=0,1+p1p22p,p=βαα+βotherwise,

Las fórmulas no se ven afectadas por la escala de amplitud de los datos. Para la estimación de frecuencia, rara vez tendría un sinc cambiado de tiempo puramente real, pero si lo hace, hay fórmulas de interpolación exactas para ello .

Olli Niemitalo
fuente