Calcular e interpretar a frequência instantânea

9

Eu sou novo no princípio de calcular a frequência instantânea e fiz muitas perguntas. Você encontra todos eles em uma lista de marcadores no final deste texto. O texto pode ser um pouco longo, desculpe-me por isso, mas eu realmente tentei resolver esse problema sozinho.

Então, eu estou interessado na frequência instantânea de um sinal com valor real . O cálculo é feito com a ajuda de um sinal analítico , onde é a transformação de Hilbert de .f(t)x(t)z(t)=x(t)+jy(t)y(t)x(t)

Para calcular as frequências instantâneas a partir do sinal analítico , segui o artigo:z(t)

O cálculo da frequência instantânea e da largura de banda instantânea por Arthur E. Barns, de 1992. Neste artigo, ele introduz vários métodos para calcular a frequência instantânea. Eu escrevo, todas as fórmulas que ele propôs (e eu usei) em um momento.

Para "aprender", brinquei com um sinal muito simples e dois um pouco mais complexo, no MATLAB, e queria obter suas frequências instantâneas.

Fs = 1000;                                            % sampling-rate = 1kHz
t = 0:1/Fs:10-1/Fs;                                    % 10s 'Timevector'
chirp_signal = chirp(t,0,1,2);                         % 10s long chirp-signal, signal 1
added_sinusoid = chirp_signal + sin(2*pi*t*10);        % chirp + sin(10Hz), signal 2
modulated_sinusoid = chirp_signal .* sin(2*pi*t*10);   % chirp * sin(10Hz), signal 3

As plotagens no domínio do tempo desses três sinais têm a seguinte aparência: Gráficos no domínio do tempo

As plotagens de todas as frequências instantâneas que obtive após a aplicação de todos os métodos do artigo são as seguintes:

Frequências instantâneas de sinal de chirp puro: Frequências instantâneas de sinal de chirp puro Frequências instantâneas de sinal de chirp com sinusóide adicional: Frequências instantâneas de sinal de chirp com adição de sinusóide Frequências instantâneas de sinal de chirp modulado: Frequências instantâneas do sinal de chirp modulado Observe que nas três imagens os eixos y dos gráficos 3 e 4 são ampliados, de modo que as amplitudes daquelas sinais são muito pequenos!

A primeira possibilidade de passar do sinal analítico para a frequência instantânea é: onde é a fase instantânea. Eu acho que esse é o método mais comum usado hoje, pelo menos na página do MATLAB é calculado dessa maneira. O código tem a seguinte aparência:

f2(t)=12πddtθ(t)
θ(t)

function [instantaneous_frequency] = f2(analytic_signal,Fs)
    factor =  Fs/(2*pi);
    instantaneous_frequency = factor * diff(unwrap(angle(analytic_signal)));
    % Insert leading 0 in return-vector to maintain size
    instantaneous_frequency = [0 instantaneous_frequency];
end

No artigo, Barns sugere agora (ou melhor, as ditas compilações) outras quatro maneiras de calcular frequências instantâneas a partir do sinal analítico. Ele também menciona a fórmula superior, mas é a opinião de que ela é impraticável devido a ambiguidades na fase. Eu acho que ele não conhecia o unwrap()método ou, para ser mais preciso, a matemática por trás dele. (Eu mesmo aprendi sobre esse método ainda hoje, quando observamos outros códigos-fonte em frequências instantâneas)

Em seu artigo, a fórmula possui a etiqueta Número (2), portanto, dei a f (t) o índice 2. Todos os outros índices correspondem da mesma maneira que seus números no artigo.

Por causa das ambiguidades em fase, ele sugere:

f3(t)=12πx(t)y(t)ax(t)y(t)bx(t)2c+y(t)2d
Apresentei os símbolos "a", "b", "c" e "d", para facilitar um pouco a programação:

function [instantaneous_frequency] = f3(analytic_signal,Fs,T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    diff_x = diff(x);
    diff_y = diff(y);
    factor = Fs/(2*pi);
    a = x(2:end).*diff_y;
    b = y(2:end).*diff_x;
    c = x(2:end).^2;
    d = y(2:end).^2;
    instantaneous_frequency = factor * ((a-b)./(c+d));
    % Insert leading 0 in return-vector to maintain size
    instantaneous_frequency = [0 instantaneous_frequency];
end

Em seguida, Barner fornece mais três fórmulas denominadas "aproximações instantâneas de frequência":

f9(t)=12πTarctan[x(t)y(t+T)ax(t+T)y(t)bx(t)x(t+T)c+y(t)y(t+T)d]

function[instantaneous_frequency] = f9(analytic_signal, Fs, T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = Fs/(2*pi*T);
    a = x(1:end-T).*y(1+T:end);
    b = x(1+T:end).*y(1:end-T);
    c = x(1:end-T).*x(1+T:end);
    d = y(1:end-T).*y(1+T:end);
    instantaneous_frequency = factor.*atan((a-b)./(c+d));
    % Append 0 to return-vector to maintain size
    instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end

f11(t)=14πTarctan[x(tT)y(t+T)ax(t+T)y(tT)bx(tT)x(t+T)c+y(tT)y(t+T)d]

function [instantaneous_frequency] = f11(analytic_signal, Fs, T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = Fs/(4*pi*T);
    a = x(1:end-2*T).*y(1+2*T:end);
    b = x(1+2*T:end).*y(1:end-2*T);
    c = x(1:end-2*T).*x(1+2*T:end);
    d = y(1:end-2*T).*y(1+2*T:end);
    instantaneous_frequency = factor.*atan((a-b)./(c+d));
    % Append and insert 0s to maintain size
    instantaneous_frequency = [zeros(1,T) instantaneous_frequency zeros(1,T)];
end

f14(t)=2πT[x(t)y(t+T)ax(t+T)y(t)b(x(t)+x(t+T))2c+(y(t)+y(t+T))2d]

function [instantaneous_frequency] = formula14(analytic_signal, Fs, T);
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = 2*Fs/(pi*T);
    a = x(1:end-T).*y(1+T:end);
    b = x(1+T:end).*y(1:end-T);
    c = (x(1:end-T)+x(1+T:end)).^2;
    d = (y(1:end-T)+y(1+T:end)).^2;
    instantaneous_frequency = factor * ((a-b)./(c+d));
    % Append and insert 0s to maintain size
    instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end

Nas três aproximações, as fórmulas T foram definidas como Fs (T = Fs = 1000 = 1s), conforme sugerido no artigo.

Agora minhas perguntas são:

  • As fórmulas f2 e f3 retornam o mesmo resultado para o sinal de chirp puro. Eu acho que isso é bom, pois eles calculam o mesmo. Os três métodos de aproximação não retornam o mesmo, nem mesmo algo próximo! Por que é esse o caso? (Espero que não seja apenas um bug de programação ...)
  • Embora eles retornem o mesmo, especialmente no final do enredo, eles começam a se mexer bastante . Qual a explicação para isso? Primeiro pensei em algo como serrilhado, mas minha frequência de amostragem é bastante alta, comparada à frequência dos sinais, então acho que isso pode ser excluído.
  • Pelo menos f2 e f3 parecem funcionar apropriadamente em um sinal de chirp puro, mas todos os métodos, incluindo f2 e f3, parecem falhar horrivelmente, quando se trata de mais de uma frequência no sinal. Na realidade, ter mais de uma frequência em um sinal é sempre o caso. Então, como obter a (mais ou menos) freqüência instantânea correta?

    • Na verdade, eu nem sei o que esperar, quando mais de uma frequência está presente no sinal. O cálculo retorna um número para um determinado ponto no tempo, então o que deve fazer quando, como aqui, mais frequências estão presentes? Retornar a média de todas as frequências ou algo assim?
  • E minha pergunta provavelmente mais importante é: como isso é tratado em um software real e elaborado? Digamos que eu queira saber a frequência instantânea do sinal modulado em 1,75 s, e escolhi o método f2, pois posso ter "sorte" e obter um número próximo de 6 [Hz], que provavelmente é a resposta correta, ou eu pego meus resultados poucas amostras ao lado e, de repente, recebo algum resultado com fio, até alto, porque, infelizmente, escolhi um valor no pico. Como isso pode ser tratado? Ao processá-lo com um filtro médio ou melhor ainda com mediana? Eu acho que até isso pode ficar realmente difícil, especialmente em regiões onde muitos picos estão próximos um do outro.

E uma última pergunta, não tão importante, por que a maioria dos trabalhos que encontro sobre frequências instantâneas são da área da geografia, especialmente no cálculo de eventos sismográficos como terremotos. O artigo de Barne também toma isso como exemplo. A frequência instantânea não é interessante em muitas áreas?

Até agora, sou muito grato por cada resposta, especialmente quando alguém me dá dicas de como implementá-lo em um projeto de software real ;)

Atenciosamente, Patrick

muuh
fonte

Respostas:

4

Não é realmente uma resposta, mas talvez útil: Pessoalmente, descobri que o conceito de frequência instantânea só é útil para sinais de banda suficientemente estreitos.

Considere o exemplo simples de duas ondas senoidais constantes, digamos 100Hz e 934Hz. Nesse caso, você certamente pode definir e calcular a frequência instantânea (da maneira que desejar), mas qual deve ser o resultado? Que insight ou propriedades possíveis pode ter a frequência instantânea que diz algo significativo sobre o sinal? A aplicação do conceito de frequência instantânea a sinais que possuem várias frequências ao mesmo tempo simplesmente não faz muito sentido.

É por isso que você obtém resultados decentes nas varreduras, mas curvas ímpares na varredura + senoidal. É também a razão pela qual você vê as manobras na parte alta da varredura. A largura de banda do sinal fica muito alta para atribuir um único número de frequência a ele e, portanto, os resultados aumentam.

Hilmar
fonte
Obrigado pela dica até agora, e acho que esse comentário faz uma boa observação. Mas então eu me pergunto por que o cálculo da fase instantânea do "sinal de chirp puro" apresenta problemas quando acima de 20Hz. Ainda existe apenas uma frequência para determinar, presente.
muuh
// o conceito de frequência instantânea só é útil para sinais de banda suficientemente estreitos.// ------ sim, como um único senoide AM'd e FM'd.
robert bristow-johnson #
4

Pelo menos f2 e f3 parecem funcionar apropriadamente em um sinal de chirp puro, mas todos os métodos, incluindo f2 e f3, parecem falhar horrivelmente, quando se trata de mais de uma frequência no sinal. Na realidade, ter mais de uma frequência em um sinal é sempre o caso. Então, como obter a (mais ou menos) freqüência instantânea correta?

como Hilmar sugere, o método de transformação de Hilbert (ou "sinal analítico") não funciona em banda larga porque há mais de um componente de frequência. você pode fazer esse método apenas para um único componente sinusoidal.

portanto, com a abordagem do sinal analítico, o que você deseja fazer é usar essa identidade:

arctanuarctanv=arctan(uv1+uv)

|uv|f9

mas deve haver apenas um senoide variável no tempo no cálculo da transformação de Hilbert para fazer isso corretamente. e é melhor alinhar o componente "em fase" com a saída da transformação Hilbert (que é atrasada com um filtro FIR causal). caso contrário, você terá uma porcaria.

Robert Bristow-Johnson
fonte
1

Uau, que grande questão. Vou responder à pergunta não tão importante primeiro:

E uma última pergunta, não tão importante, por que a maioria dos trabalhos que encontro sobre frequências instantâneas são da área da geografia, especialmente no cálculo de eventos sismográficos como terremotos. O artigo de Barne também toma isso como exemplo. A frequência instantânea não é interessante em muitas áreas?

O motivo é que o sistema sismográfico "vibroseis" é usado na indústria de petróleo para realizar pesquisas sísmicas. Os caminhões aos quais vinculei vibram de cerca de 5 Hz a cerca de 90 Hz e podem ser feitos para emitir sinais sonoros. Há muito dinheiro na indústria do petróleo, e o processamento dos retornos desses sinais pode ser muito, muito lucrativo. Portanto, muitas pessoas passaram muitas horas analisando esses sinais, incluindo a observação de técnicas instantâneas de frequência.


TM

Confira este documento.

Melhores abordagens tendem a usar "médias ponderadas por fase", conforme implementadas aqui . Ou aqui para um link direto para o Matlab .

Peter K.
fonte
1

Lamento fornecer uma resposta um ano após o fato, mas me deparei com este post enquanto procurava por artigos sobre esse mesmo tópico. Suas perguntas refletem as divergências e interpretações generalizadas da "frequência instantânea" que atormentam o campo desde o seu início. Várias pessoas dirão a você, como algumas das respostas aqui, que o FI é aplicável apenas a sinais de "banda estreita" ou "mono-componente". De fato, isso não é verdade: algumas vezes o FI obtido pela transformação de Hilbert é perfeitamente bem-comportado para sinais de banda larga e / ou "multi-componentes". Uma quantidade proposta que evita muitas dessas dificuldades é a "frequência instantânea média ponderada (WAIF)", que pode ser medida usando um espectrograma.

Veja Loughlin em J. Acoust. Soc. Am., Janeiro de 1999. Outros bons artigos sobre IF e equívocos comuns são de Picinbono (IEEE Trans. Sig. Proc., Março de 1997) e Vakman (IEEE Trans. Sig. Proc., Abril de 1996).

hóspede
fonte