Pergunta

Estou me perguntando se algo assim é possível (e relativamente fácil de fazer) e, em caso afirmativo, como eu poderia fazer isso?

Eu gostaria de fazer filtragem de banda em um arquivo de onda que estou reproduzindo. Algo semelhante ao "equalizador" que você vê na maioria dos aplicativos do tipo Winamp.
Minha idéia é, no entanto, não igualar o som, mas usar valores de db negativos muito altos, para quase matar a banda que estou filtrando.

A primeira pergunta é: o DirectSound me dá algo que me permite fazer isso?
Caso contrário: como você iria implementar isso?
Eu sei (embora eu não o entenda completamente) que você pode converter da forma de onda amostrada para a distribuição de frequências usando uma transformação rápida de Fourier. Agora, obviamente não posso voltar dessa distribuição para a forma de onda original depois de alterar os valores de amplitude de certas frequências :-)

Como eu poderia fazer algo assim?

Além disso, quão preciso posso fazer esses filtros? (Se eu quisesse filtrar tudo de 2250Hz a 2275Hz, qual seria o erro que um filtro teria? Qual a precisão máxima da qual eu posso depender?)

Obrigado!

Foi útil?

Solução

Não sei se o DirectSound oferece essa funcionalidade, eu suponho que não, já que o DSP é bastante complicado e geralmente varia muito da situação para a situação. O que você deseja fazer é normalmente chamado de "filtragem" no DSP (processamento de sinal digital). Muitas vezes isso envolve o uso de um filtro FIR (resposta de impulso finito). Existem muitas bibliotecas por aí para fazer exatamente o que você deseja. Nos aspectos mais complicados do design do filtro é que sempre há trocas entre velocidade, precisão e erro. No seu exemplo, você poderá remover o sinal entre as frequências, mas isso também afetará as frequências circundantes. A quantidade que ele afetará está relacionada ao tempo de processamento e design de filtro.

Talvez comece aqui (matemática pesada): Filtro de abeto

Em seguida, Google para o seu próprio Windows/DirectSound específico Informações relacionadas ao FIR

Outras dicas

DirectSound não faz filtragem de banda como você descreve aqui, tanto quanto eu sei.

A idéia geral por trás da filtragem BandPass é usar linhas de atraso, que pegam a saída do sinal e a alimentam de volta ao fluxo de entrada, com um tempo de atraso especificado e fator de decaimento (ou atenuação). O design cuidadoso do filtro permitirá ampliar ou atenuar faixas de frequência específicas em sua fonte de áudio. Observe que essa técnica não usa FFT, exceto como talvez uma ferramenta de diagnóstico durante os efeitos do filtro. As técnicas de FFT fazem um trabalho mais preciso de limitar ou amplificar frequências, mas as linhas de atraso são geralmente mais rápidas (e muito mais fáceis de codificar).

Para processar um arquivo WAV (em vez de fazer síntese/filtragem em tempo real), a execução de uma linha de atraso no seu buffer de áudio é tão simples quanto:

for (int i = 0; i < samples.Length - delay; i++)
{
    samples[i + delay] += samples[i] * decay;
}

É um pouco mais complicado do que isso na prática (você precisa lidar com possíveis valores de transbordamento, por exemplo, e alguns tipos de linhas de atraso precisam ser executados ao contrário, o que é sempre uma dor na codificação do estilo C), é claro.

Quanto ao quão preciso é o filtro, isso depende apenas de quão bem ele foi projetado (é muito difícil). Ao projetar um filtro usando linhas de atraso, você está fazendo a mesma coisa que os engenheiros elétricos fizeram (e ainda o fazem) nas décadas antes dos microprocessadores baratos.

DirectSound não oferece instalações de processamento de sinal. Há uma variedade de técnicas que você pode usar para fazer o que deseja. É possível usar a FFT para fazer o que você deseja, mas provavelmente não é o melhor ou mais fácil método. Você deve ler o Audio DSP, principalmente a filtragem digital (IIR, FIR). Há um bom livro DSP disponível online gratuitamente chamado O Guia do Cientista e Engenheiro para Processamento de Sinais Digital O que definitivamente vale a pena dar uma olhada. Existem também muitos outros bons livros DSP disponíveis na Amazon etc.

Não conheço nenhuma biblioteca que cuide diretamente desse tipo de coisa.

Você pode alcançar o que deseja com transformadas de Fourier, implementações como o Fftw Faça o trabalho de cálculo para você, mas na minha experiência é bastante desagradável para trabalhar e use quantidades prodigiosas de memória, especialmente se você quiser processar pedaços mais longos de áudio em um acerto.

A idéia básica para aplicar o EQ usando a FFT é o seguinte:

  1. Obtenha seu áudio. O áudio é apenas uma variedade muito longa de valores (amostras), que é o deslocamento do cone do alto -falante / com o tempo.
  2. Pegue a transformação de Fourier do áudio (o Libary fará isso, mas você terá que derramar as amostras de áudio para o formato certo. Isso converte as amostras baseadas em tempo em uma representação baseada em frequência - essencialmente isso converte o sinal para mostrar a distrobição de frequência no sinal.
  3. Divida a distribuição de frequência - divida a distrobição em regiões, cada região será uma série de frequências.
  4. Em seguida, você pode executar ajustes nas faixas de frequência - para o seu exemplo, você pode zero uma região para remover todo o rastro dela.
  5. Pegue a transformação inversa de Fourier da distração de frequência atualizada. Isso retornará a representação ao domínio do tempo, reconstruindo uma (aproximação) do sinal original, mas com os ajustes que você fez.

Fazer algo assim permitirá que você manipule com precisão as freqüências presentes em seu áudio, dando a você o tipo de controle que você parece querer. Esteja avisado, no entanto, que não é simples de implementar.

Recomendo a leitura do assunto. A detecção de batidas está intimamente ligada a muito disso (usa muito as técnicas básicas) - tente as primeiras seções aqui como um começo.

Espero que isso ajude um pouco.

O DirectSound pode não apoiar isso diretamente, mas o DirectShow deve. Você poderia usar essa API?

Eu segundo a ideia do filtro FIR. Para obter um entalhe estreito, você precisará de um núcleo de filtro longo.

Basicamente, você usa a convolução do fluxo de entrada em relação a um conjunto de valores (o kernel). Cada amostra de saída é uma soma das N amostras anteriores multiplicadas com sua entrada correspondente no kernel do filtro.

Portanto, você precisa manter uma matriz de kernel e um tampão FIFO ou circular do mesmo número de amostras.

Eles são calculadoras de kernel de filtro FIR na web, basta pesquisar no Google "FIR FILLUGLET".

Você deve fazer uma FFT, mexer no domínio da frequência (caixas de frequência de escala) e depois fazer um IFFT para recuperar o sinal do domínio do tempo. Caso contrário, projetar filtros usando Scopefir ou Matlab é bem fácil. O SCOPEFIR pode projetar facilmente um filtro de parada de banda e fornecer os coeficientes para que você possa fazer uma convolução no sinal. Aqui está um tutorial do site do Scopefir: http://www.iowegian.com/fir/tutor/firintro.htm

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top