STFT e DWT (wavelets)

12

O STFT pode ser usado com sucesso em dados de som (com um arquivo de som .wav, por exemplo) para fazer algumas modificações no domínio da frequência (por exemplo: remoção de ruído).
Com N=441000(isto é, 10 segundos a taxa de amostragem fs=44100), windowsize=4096, overlap=4, STFT produz approximatively uma 430x4096matriz (primeira coordenada: período de tempo, segundo coordenadas: bin frequência). Modificações podem ser feitas nessa matriz e reconstrução com overlap-add (*).

Como é possível fazer algo semelhante com wavelets ? (DWT), ou seja, obter uma matriz de forma semelhante a x b, com aintervalos de tempo e bintervalos de frequência, faz alguma modificação nessa matriz e, no final, recupera um sinal? Como ? Qual é a wavelet equivalente a sobreposição-adição ? Quais seriam as funções Python envolvidas aqui (não encontrei um exemplo fácil de modificação de áudio com pyWavelets...)?

(*): Aqui está a estrutura STFT que pode ser usada:

signal = stft.Stft(x, 4096, 4)    # x is the input
modified_signal = np.zeros(signal.shape, dtype=np.complex)

for i in xrange(signal.shape[0]):    # Process each STFT frame
    modified_signal[i, :] =  signal[i, :] * .....  # here do something in order to
                                                   # modify the signal in frequency domain !
y = stft.OverlapAdd(modified_signal, 4)   # y is the output

O objetivo é encontrar uma estrutura semelhante com wavelets.

Basj
fonte
Um comentário secundário: fazer esse tipo de "filtragem" no STFT é uma péssima idéia. Não é uma ótima maneira de fazer a maioria das coisas que você realmente deseja fazer. O que você está realmente tentando alcançar?
Peter K.
Observe que PyWavelets é apenas para transformação de wavelet discreta. Se você quiser fazer coisas do tipo STFT, entenderia mais facilmente a transformação de wavelet contínua, como a transformação Q constante, que é uma transformação de Gabor, essencialmente a mesma coisa que uma transformação de wavelet contínua complexa de Morlet , mas foi projetada para ser invertível: grrrr.org/research/software/nsgt
endolith
1
(esta questão foi revivida por "Community".) na minha opinião, as wavelets se sobrepõem e se somam de maneira muito semelhante à STFT. então eu não entendo bem a natureza da questão.
Robert Bristow-johnson
Há mais detalhes necessários?
Laurent Duval

Respostas:

4

A transformada de Fourier de curto prazo geralmente é uma transformação redundante, geralmente implementada com a mesma subamostragem em todas as frequências. Se a janela for bem escolhida, ela estará completa: você pode invertê-la e recuperar qualquer sinal inicial.

Por ser redundante e completo, possui muitos inversos perfeitos. Ele pode ser implementado e entendido usando ferramentas mais genéricas: bancos de filtros complexos (super amostrados). Dado um tipo e comprimento de janela mais a sobreposição, você fornece um banco de filtros de análise para o qual você pode calcular se é invertível ou não. Se isso acontecer, você pode calcular uma inversa natural e inversas otimizadas também. O overlap-add é apenas um dos muitos inversos em potencial, provavelmente o mais comum, o que geralmente restringe a escolha da janela.

As transformadas de wavelet discretas padrão também são bancos de filtros, com a diferença de que a subamostragem não é a mesma em cada faixa de frequência (ou é mais apropriada na escala). Isso se transforma em comprimentos irregulares para cada balança. No entanto, existem implementações redundantes de wavelets que produzem "uma matriz retangular" de coeficientes com os quais você pode trabalhar. Os esquemas mais conhecidos são chamados sob nomes diferentes: wavelets invariantes por turnos ou invariantes pelo tempo, wavelets não calculadas, transformação estacionária de wavelets(SWT) e, às vezes, girando o ciclo. Sua reconstrução padrão envolve etapas semelhantes à adição de sobreposição, exceto que elas são mais "incorporadas" devido aos diferentes fatores de amostragem nas escalas. Você pode usá-los com qualquer wavelet discreto de uma biblioteca ou até mesmo projetando sua própria wavelet. O motivo é que as wavelets discretas padrão foram projetadas com a não redundância em mente, o que restringe a escolha das wavelets. Com redundância, você aumenta a escolha da wavelet, pois as restrições a serem cumpridas são menos rigorosas. O avatar "final" é a transformação contínua de wavelets, que admite "quase" todas as wavelets de síntese inversa. Minha última frase é péssima, espero que você entenda: quando uma matriz quadrada é invertível, ela tem apenas uma inversa. Quando uma matriz "retangular" é invertida à esquerda de uma maneira generalizada,

Parece haver uma implementação em python da Transformada Wavelet Estacionária . Você pode encontrar algumas referências no 2.3.4. Capítulo wavelets de tradução invariante do artigo vinculado .

Geralmente é muito mais robusto para detecção, remoção de vazamentos ou restauração em aplicações práticas (geofísica, testes não destrutivos, ultrassons, vibrações).

Laurent Duval
fonte
O significado "redundante" "possui mais informações na saída do que o necessário para reproduzir a entrada"?
Endolith
1
Exatamente. Geralmente, para um sinal de amostra , você obtém coeficientes M > N após a transformação. Isso significa que você pode usar isso para seu benefício. Por exemplo, você obtém vários potenciais inversos, alguns sendo mais práticos que outros. Mais importante, ao processar no domínio de transformação (aprimoramento, detecção, remoção de ruído, filtragem adaptativa, restauração, desconvolução, separação de fontes), você obtém robustez e menor sensibilidade ao ruído. Isso vem da "diversidade" adicional nos dados transformados. Quando usado adequadamente apenas ...NM>N
Laurent Duval
3

A razão pela qual você precisa sobrepor adicionar / sobrepor, exceto para filtrar com a transformada de Fourier, é basicamente que as funções básicas associadas aos coeficientes que você obtém são definidas em um determinado intervalo de tempo (em oposição a um único ponto no tempo). A transformação de Fourier usada para calcular os coeficientes de expansão também implementa a convolução em um domínio circular definido pelo comprimento do quadro do sinal. Isso significa que os dois pontos finais do quadro são realmente identificados e fechados em um círculo. É por isso que você precisa se certificar de que as funções básicas dos coeficientes editados nunca afetem as duas extremidades do quadro.

As wavelets não são autovetores de conversão de tempo nem são calculadas usando convolução circular. Isso significa que você não precisa adicionar ou salvar sobreposições ou qualquer outro método que lide com os efeitos colaterais da convolução circular. Em vez disso, os vetores de base wavelet são apenas uma base possível para descrever seu sinal. A transformação de wavelet (completa, discreta e possivelmente ortogonal) não é, portanto, mais que uma mudança de base da base do domínio do tempo para a base do domínio da wavelet. As alterações de base podem ser invertidas (aplicando a inversa da matriz de mudanças de base que o levou até lá) e você pode voltar ao domínio do tempo.

Os parâmetros que você forneceu como tamanho da janela, sobreposição e taxa de amostragem não são aplicáveis ​​à transformação wavelet. A única coisa que você precisa é de uma mãe wavelet. Se você quiser comparar os resultados à sua saída STFT, poderá escolher qualquer um dos vetores básicos de STFT (ou seja, sua janela multiplicada por uma transportadora exponencial complexa) como o protótipo da wavelet. Em seguida, você aplica a transformação wavelet rápida, que decompõe seu sinal em uma árvore de sinais filtrados e dizimados de alta e baixa passagem que acabam se tornando seus coeficientes. Cada coeficiente está associado a um vetor base wavelet e seus parâmetros (escala, tempo) ou (frequência, tempo). Você pode manipular os coeficientes e aplicar a transformação inversa de wavelet discreta. Os coeficientes serão coletados e executados em um banco de filtros de ressíntese para produzir um sinal novamente.

Esses processos não são triviais e possivelmente difíceis de digerir para iniciantes. Mas você deve poder encontrar bibliotecas / caixas de ferramentas para sua plataforma preferida que implementam a transformação rápida de wavelet e sua inversa. No entanto, se você deseja realizar sua própria base de wavelets, precisará derivar os coeficientes de filtro para os bancos de filtros de decomposição e síntese. Isso requer alguma teoria profunda, e você provavelmente terá que estudá-la primeiro.

Existem outros sabores da transformação wavelet, a saber, a transformação contínua wavelet, que trabalha com uma base incompleta. É muito mais lento para calcular e muito mais difícil de inverter, de modo que atualmente não é uma opção para o que você deseja fazer.

Jazzmaniac
fonte
1
Obrigado pela sua resposta. A principal razão pela qual estou tentando ter uma estrutura de código é que eu sempre notei (desde a minha infância até alguns anos atrás, quando terminei meu doutorado (não relacionado ao DSP, é claro, se assim não seria) Então, perguntas para iniciantes aqui!)) é que manipular algum material da vida real (por exemplo, sinal de áudio no DSP) ajuda muito a entender a teoria profunda. O que eu gostaria de código é: Audio sound -> Wavelet transform -> (do something on the array) -> Inversion -> Audio output. Com muito (faça algo na matriz), tenho certeza de que vou entender um pouco mais como a wavelet funciona.
Basj
1
@ Basj, então faça como eu disse. Encontre uma biblioteca python que suporte a transformação wavelet rápida e sua inversa e, em seguida, brinque com a árvore de coeficientes gerada. Boa sorte e divirta-se!
19413 Jazzmaniac
"todos não são aplicáveis ​​à transformada wavelet" Eles são aplicáveis ​​ao CWT, certo?
Endolith
1

Existem muitas maneiras de definir uma base de wavelet. Normalmente, uma wavelet se parece com:

wx0,k0(x)=Aexp(ik0x)e(k0(xx0))

Em que é o centro no tempo, k 0 é o centro em frequência e e é uma função da janela. A absorve a fase e a normalização. A principal maneira pela qual isso difere do seu STFT é que a largura da janela depende de k .x0k0eAk

(x0,k0)(x0,k0) , mas com recursos computacionais razoáveis.

Como a dimensionalidade dos dados transformados excede a do sinal, a base da wavelet não será ortonormal. Ou seja, o seguinte será falso:

wk0,x0|wk0,x0=δ(x0,x0)δ(k0,k0)

Aw

x0,k0|wx0,k01k0wx0,k0|=identity

Em outras palavras, você pode reconstruir o sinal perfeitamente adicionando suas wavelets constituintes.

Sua "modificação" pode ser simplesmente inserida na soma acima:

my_filter=x0,k0|wx0,k0f(x0,k0)wx0,k0|

Atualização 19/11/2013: Adicionando detalhes de implementação abaixo, conforme solicitado.

f(x)

cx0,k0=wx0,k0|f

k0cx0,k0x0ffw0,k0cx0,k0

  • ff^ . Provavelmente você quer fazer isso uma janela de cada vez, com sobreposição suficiente para poder jogar fora os artefatos de janelas, etc., mas, para simplificar, vamos supor que você faça todo o sinal de uma só vez e que seu comprimento seja uma potência de dois.
  • k01/4
    • f^w^0,k0
    • [kl,kr)w^0,k0
    • Aplique uma transformação de Fourier inversa a isso.
    • exp(ixkl+kr2)cx0,k0x0

k0x0w0,k0k0k0 valor de em resolução de tempo muito menor. Funciona da mesma forma que o STFT - talvez mais lento por algum pequeno fator que depende da resolução que você escolher.

cx0,k0k0

Às vezes, o truncamento de espectros apresenta problemas de normalização, dependendo de como a FFT está definida. Não tentarei cobrir todas as possibilidades aqui. A normalização é basicamente um problema fácil. ;-)

A única parte que resta é escolher um envelope wavelet adequado. Acontece que é mais fácil obterW^x0 0,k0 0(k) certo do que obter Wx0 0,k0 0(x)certo. Uma definição adequada (de muitas possibilidades) é:

w^x0,k0=Aexp(i(kk0)x0)exp((Qlog(k/k0))2)

in which Q is a dimensionless constant that selects the bandwidth of your filter, i.e. the frequency resolution of your wavelets, and A is chosen as necessary for normalisation. With this definition and sufficiently high resolution for k0, the overcompleteness condition holds, and the signal reconstruction will work.

apt1002
fonte
1
Thank you for recalling these important points about wavelet theory, which are necessary indeed to understand how it works. But here the question would be more about building a framework code that would work on audio signal for example. The questions are : how to deal with these infinite sums, how to choose the windows (or rather mother-wavelet), how to do it using pyWavelets in Python (or another equivalent language, I'll translate into Python then), how to choose the parameters (like in my example for audio : sampling rate=44100, fft window = 4096, overlap=4, etc.)
Basj
Your notion of overcompleteness is not accurate. A basis being complete means, that the canonical projector onto the basis is the identity operator. But to write is as the sum of the outer product you need orthonormality. For overcompleteness you cannot have orthonormality, so that outer product decomposition does not work. But you can make it work by saying a basis is complete (and possibly overcomplete), if there are coefficients ak so that k|kakk|=Id
Jazzmaniac
hmm you have introduced a morlet wavelet, but all wavelet doesn't have fb and fc, so they might have constant K, also its impossible to make a DWT with morlet, bx its not orthogonal, actually I couldn't get a fine resolution for frequency estimation with DWT compare to the cwt or STFT @apt1002
Electricman
In addition, finding these coefficients ak is non trivial, and also non-unique. The linear dependence of the basis vector implies, that there are infinitely many possible such ak if the basis is overcomplete. That implies your "filter" is not well defined, in fact, it's not defined at all, because you don't know what you control with your filter function f. Each aspect of the signal is realized in many linear dependent wavelet basis vectors. So your theory falls apart.
Jazzmaniac
1
The best way to see if it works or not would be to provide a minimal code example (with pyWavelet for example it should be possible in a few lines I imagine) (I'll do itas well it once I understand it, I think I need a few more days reading about wavelets!)
Basj