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 430x4096
matriz (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 a
intervalos de tempo e b
intervalos 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.
Respostas:
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).
fonte
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.
fonte
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.Existem muitas maneiras de definir uma base de wavelet. Normalmente, uma wavelet se parece com:
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 .x0 k0 e A k
Como a dimensionalidade dos dados transformados excede a do sinal, a base da wavelet não será ortonormal. Ou seja, o seguinte será falso:
Em outras palavras, você pode reconstruir o sinal perfeitamente adicionando suas wavelets constituintes.
Sua "modificação" pode ser simplesmente inserida na soma acima:
Atualização 19/11/2013: Adicionando detalhes de implementação abaixo, conforme solicitado.
À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) é:
in whichQ 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.
fonte