Como mudar circularmente um sinal por uma fração de uma amostra?

22

O teorema da mudança diz :

Multiplicando por uma fase linear e 2 π ixn para algum número inteiromcorresponde a umdeslocamento circularda saídaXk:Xké substituído porXk-m, onde o subscrito é interpretado no móduloN(ou seja, periodicamente).e2πiNnmXkXkXkm

Ok, isso funciona bem:

plot a

sinal arbitrário de 9 amostras

N = 9
k = [0, 1, 2, 3, 4, 5, 6, 7, 8]
plot ifft(fft(a)*exp(-1j*2*pi*3*k/N))

sinal deslocado por 3 amostras no domínio da frequência

Mudou em 3 amostras, como eu esperava.

Eu pensei que você também poderia fazer isso para mudar por frações de uma amostra, mas quando eu tento, meu sinal se torna imaginário e nada parecido com o original:

plot real(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N)))
plot imag(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N))), 'b--'

sinal após multiplicar por 3,5 exponenciais complexas

Eu não esperava isso. Isso não equivale a convolver com um impulso real que foi alterado por 3,5 amostras? Então o impulso ainda deve ser real, e o resultado ainda deve ser real? E deveria ter mais ou menos a mesma forma que o original, mas sincero interpolado?

endólito
fonte
Aqui está um arquivo Matlab Troca submissão que calcula a modulação correta, mesmo para ímpar de comprimento reais sinais / / complexos e fracionários-atrasos eles: mathworks.com/matlabcentral/fileexchange/7886-fshift
Ahmed Fasih

Respostas:

14

Se você deseja que a saída deslocada do IFFT seja real, a torção / rotação de fase no domínio da frequência deve ser conjugada simétrica, bem como os dados. Isso pode ser conseguido adicionando um deslocamento apropriado ao expoente do exp () complexo, para a inclinação de fase especificada, para que a fase da metade superior (ou negativa), módulo 2 Pi, espelhe a metade inferior na abertura da FFT . A função complexa de deslocamento exponencial também pode ser conjugada simétrica, indexando-a de -N / 2 a N / 2 com uma fase de zero no índice 0.

Acontece que o deslocamento apropriado para torções ou espirais de fase, que completam múltiplos inteiros exatos de 2 rotações Pi na abertura, para serem conjugados simétricos na abertura, é zero.

Com um vetor de torção de fase simétrica conjugada, o resultado deve terminar como uma interpolação circular de Sinc para turnos não inteiros.

Elaboração por OP:

Sua escolha de k = [0, 1, 2, 3, 4, 5, 6, 7, 8] está produzindo um exponencial complexo assimétrico:

tentativa de troca de amostra exponencial complexa complexa assimétrica de 0,5, com parte imaginária como linha tracejada

Se você usar k = [0, 1, 2, 3, 4, -4, -3, -2, -1], obterá um exponencial complexo Hermite-simétrico simétrico:

plot(fftshift(exp(-1j * 2*pi * 0.5/N * k)))

Exponencial complexo hermético-simétrico para deslocamento de 0,5 amostras, com parte imaginária como linha tracejada

e agora, quando você usa a mesma fórmula exponencial para alternar entre 0,5 ou 3,5 amostras, obtém um resultado real:

plot ifft(fft(a)*exp(-1j * 2 * pi * 0.5/N *k))
plot ifft(fft(a)*exp(-1j * 2 * pi * 3.5/N *k))

deslocamento de 0,5 e 3,5 amostras, com o original como linha pontilhada

hotpaw2
fonte
Aha! Em vez de k = [0, 1, 2, 3, 4], eu deveria estar usandok = [0, 1, 2, -2, -1]
endolith
@endolith / hotpaw2, em outras palavras, é tudo sobre a indexação das amostras no domínio do tempo?
TheGrapeBeyond
1
A simetria em torno do compartimento 0 também fornecerá simetria em torno de N / 2, mesmo que N / 2 não seja um número inteiro.
hotpaw2
1
Encontrei uma função que aplica a modulação correta no Matlab File Exchange: mathworks.com/matlabcentral/fileexchange/7886-fshift 👏!
Ahmed Fasih
1
isso vale igualmente para sinais complexos?
Leo