Recentemente, comecei a brincar com a transformação de Fourier (depois de passar algumas semanas aprendendo sobre a matemática por trás dela). Decidi tentar hackear um filtro passa-baixo na seguinte sequência de sons:
Particularmente, peguei a transformada de Fourier, zerei o 1/2 mais alto das frequências e depois a transformada de Fourier inversa. Isto é o que eu tenho
Por que esse barulho de estalido?
fourier-transform
discrete-signals
sound
JeremyKun
fonte
fonte
Respostas:
Dois possíveis problemas:
fonte
Primeiro, apenas uma observação: as transformadas de Fourier não são ideais para filtros de passa baixa / alta. Os filtros Butterworth são um bom lugar para começar e depois dos filtros Chebyshev / Elíptico, se você for mais ambicioso.
Parece que você está tentando implementar um filtro ideal. Não há como implementar esses filtros de 'parede de tijolos' onde cortamos todas as frequências acima / abaixo de um determinado valor. Todos os filtros bem desenvolvidos diminuirão de 1 a 0 em torno da nossa frequência de corte.
Os filtros ideais são apenas possíveis teóricos e, se você tivesse uma transformação contínua de Fourier, seu método acima funcionaria.
Mas estamos fazendo transformações discretas de Fourier, para que haja mais com o que se preocupar. Como não tenho certeza do método de sua implementação, acho que você está fazendo janelas, já que apenas a retirada de frequências é uma maneira certa de ficar crepitando em uma DFT com janelas.
Ao fazer janelas em um DFT, pode-se pensar que as amplitudes de frequência entre janelas são relativamente contínuas. por exemplo, se a frequência de 400Hz tiver uma amplitude de 0,5 na janela atual, na próxima janela a amplitude será próxima de 0,5. Infelizmente, isso não é verdade; portanto, se simplesmente removermos a frequência de 400Hz da nossa DFT, poderemos ouvir estalos ou rachaduras entre as janelas.
Um pequeno exemplo: a taxa de corte é de 600Hz. A janela 1 está reproduzindo um seno de 800Hz. A janela 2 se conecta 'continuamente' à janela 1 e reproduz 400Hz. Então ouviremos um pop entre a janela porque a janela 1 ficará silenciosa e a janela 2 será ligada imediatamente.
Outra coisa a ter em mente é que só podemos representar uma quantidade finita de frequências com uma DFT. Se tivermos um arquivo de áudio com uma onda senoidal de uma frequência entre duas de nossas frequências discretas em nossa DFT, então na verdade o representamos com muitas de nossas frequências discretas. Portanto, mesmo que um exemplo de arquivo de áudio possa conter uma onda senoidal menor que o nosso ponto de corte, se sua frequência estiver entre as nossas frequências DFT, poderemos cortar parte dele e distorcê-lo com o método acima, uma vez que são necessárias frequências mais altas para representar o áudio Arquivo.
espero que ajude
fonte
Combinei um pequeno programa Python para ilustrar alguns dos conceitos - o código é horrível, mas peguei um código antigo que eu tinha para problemas semelhantes. Embora quase não haja comentários, deve ser bastante fácil de seguir devido aos pequenos módulos. O são dois dft / IDFT funções; duas funções fshiftn / fshiftp para mudar a frequência do domínio domínio DFT para filtragem; uma função dftlpass para realizar a filtragem no domínio DFT; uma função zpblpass para fazer a filtragem usando um filtro Butterworth; uma função bbdftsig para formar o sinal de teste e realizar a filtragem; e, finalmente, uma pequena função plotsigstraçar os sinais. No final do script, os diferentes parâmetros são definidos e as diferentes figuras são feitas.
Portanto, em conclusão, é possível usar a filtragem direta forçando os coeficientes de Fourier a zero, o que também é feito algumas vezes na detecção compressiva para reduzir o suporte de um sinal para forçar a escarsidade a um sinal. No entanto, há conseqüências disso, devido ao aumento de erros, principalmente nas bordas do sinal. Além disso, o acima é o melhor caso em que todo o sinal é tratado como uma sequência. Se o sinal precisar ser dividido em períodos de tempo, fica complicado, pois precisamos considerar uma técnica de janelas ou outra técnica para garantir a continuidade do sinal entre os quadros. Portanto, meu conselho é semelhante a alguns dos outros posts sobre a recomendação de usar normalmente um Butterworth / Elliptic / .. ou qualquer outro filtro.
fonte
Zerar posições em uma FFT pode realmente aumentar a amplitude de outras frequências próximas, mas não centralizadas, na posição zero-zero ou em suas posições adjacentes. Esse aumento pode causar recorte.
Além disso, se você estiver executando a FFT usando blocos sem preenchimento zero (e não sobrepostos) (em oposição à música inteira em uma grande FFT), quaisquer modificações nos dados da FFT serão contornadas de trás para a frente do teclado. sequência do domínio do tempo em cada bloco, adicionando outras descontinuidades estranhas nos lugares errados.
fonte
Aqui está um filtro de passagem de banda FFT de zeragem de caixa rápido e sujo, com o código FFT também.
para cada amostra do áudio de entrada, chame mainbandpass com a amostra de entrada e a faixa de frequências que você deseja manter em atalho e atalho. Se lowcut for maior que highcut, o resultado será um filtro de rejeição de banda. Há uma convolução circular em andamento, mas não haverá emissões fora da banda, o que é bom para os modems.
fonte