Pergunta

Eu tenho um fluxo de áudio 44Khz a partir de um CD, representada como uma matriz de amostras PCM 16 bits. Eu gostaria de cortá-la para um fluxo de 11kHz. Como faço isso? De meus dias de aula de engenharia muitos anos atrás, eu sei que o fluxo não será capaz de descrever qualquer coisa sobre 5500Hz com precisão mais, então eu suponho que eu quero tudo o corte acima que fora também. Alguma ideia? Obrigado.

Update: Há algum código em esta página que converte de 48 KHz a 8 kHz usando um algoritmo simples e uma matriz coeficiente que se parece com {1, 4, 12, 12, 4, 1}. Eu acho que é o que eu preciso, mas eu preciso dele para um fator de 4x em vez de 6x. Alguma idéia de como essas constantes são calculados? Além disso, eu acabam convertendo as amostras de 16 bytes para carros alegóricos de qualquer maneira, para que eu possa fazer o downsampling com flutuadores em vez de calções, se isso ajuda a qualidade em tudo.

Foi útil?

Solução

Leia na FIR e IIR filtra. Estes são os filtros que usam uma matriz coefficent.

Se você fizer uma pesquisa no Google sobre "FIR ou IIR designer de filtro" você encontrará lotes de software e online-applets que faz o trabalho duro (ficando os coeficientes) para você.

EDIT:

Esta página aqui ( http: //www-users.cs. york.ac.uk/~fisher/mkfilter/ ) permite que você insira os parâmetros do seu filtro e vai cuspir fora pronto para usar C-Code ...

Outras dicas

Você está certo em que você tem de aplicar lowpass filtragem em seu sinal. Qualquer sinal ao longo de 5500 Hz estará presente em seu sinal de amostragem reduzida, mas 'alias' como outra frequência para que você terá que remover aqueles antes downsampling.

É uma boa idéia para fazer a filtragem com flutuadores. Existem algoritmos de filtro ponto fixo também, mas aqueles que têm, geralmente, compensações de qualidade para o trabalho. Se você tem carros alegóricos, em seguida, usá-los!

Usando DFT do para filtrar geralmente é um exagero e isso torna as coisas mais complicadas, porque de DFT não são um processo contiuous mas o trabalho em buffers.

Os filtros digitais geralmente vêm em dois sabores. FIR e IIR. O estiver geralmente a mesma idéia, mas filtros IIF usar loops de feedback para conseguir uma resposta mais acentuada com muito menos coeficientes. Esta pode ser uma boa idéia para downsampling porque você precisa de um filtro da curva muito íngreme lá.

Downsampling é uma espécie de um caso especial. Porque você vai jogar fora 3 de 4 amostras não há nenhuma necessidade para calculá-los. Há uma classe especial de filtros para este chamados filtros polifásicos.

Tente googling para polyphase IIR ou FIR polifásica para mais informações.

Aviso (em adições para os outros comentários) que a abordagem fácil intuitiva simples " downsample por um fator de 4, substituindo cada grupo de 4 amostras consecutivas pelo valor médio ", não é ideal, mas é, no entanto, não é errado, nem praticamente nem conceitualmente. Uma vez que o cálculo da média equivale precisamente a um filtro passa baixo (uma janela rectangular, o que corresponde a um sinc em frequência). O que seria conceitualmente errado é apenas downsample tomando uma de cada 4 amostras:. Que iria introduzir aliasing

A propósito: praticamente qualquer software que faz algum resampling (áudio, imagem ou qualquer outra coisa; exemplo para o caso de áudio: SOX). Leva isso em conta, e frequentemente permite escolher o filtro passa-baixa subjacente

Você precisa aplicar um filtro passa-baixa antes de downsample o sinal para evitar "aliasing". A frequência de corte do filtro passa baixo deve ser menor do que a frequência de Nyquist, que é metade da frequência de amostra.

O processo que você está depois chamado de "Decimation". Há 2 etapas:

  1. Aplicando Low Pass Filter sobre os dados (no seu caso LPF com Cut Off em Pi / 4).
  2. Downsampling (no seu caso tomando 1 de 4 amostras).

Existem muitos métodos para projetar e aplicar o filtro Low Pass.

Você pode começar aqui:

http://en.wikipedia.org/wiki/Filter_design

Você poderia fazer uso de libsamplerate para fazer o trabalho pesado. Libsamplerate é uma API C, e cuida de cálculo dos coeficientes de filtro. Que você selecione a partir de filtros de qualidade diferentes para que você possa trocar de qualidade para a velocidade.

Se você preferiria não escrever qualquer código, você pode simplesmente usar Audacity para fazer a conversão de taxa de amostragem . Ele oferece uma interface gráfica poderosa, e faz uso de libsamplerate para ele é a conversão de taxa de amostragem.

Gostaria de tentar aplicar DFT, cortar 3/4 do resultado e aplicar DFT inversa. Eu não posso dizer se ele vai soar bem sem realmente tentar difícil.

O "melhor" solução possível é realmente um DFT, descartando o topo 3/4 das frequências, e executar uma DFT inversa, com o domínio restrito para o fundo 1 / 4th. Descartando os melhores 3 / 4ths é um filtro passa-baixo, neste caso. Estofo para uma potência de 2 número de amostras, provavelmente, dar-lhe uma vantagem de velocidade. Estar ciente de como seus FFT pacote lojas amostras embora. Se é uma TFR complexa (que é muito mais fácil de analisar, e geralmente tem propriedades mais agradáveis), as frequências vão quer ir de -22 a 22, ou de 0 a 44. No primeiro caso, você quer o meio 1 / 4th. Neste último, o mais externo 1 / 4º.

Você pode fazer um trabalho adequado pela média de valores de amostra juntos. A maneira ingênua de pegar amostras de quatro por quatro e fazer uma política de igualdade obras médias ponderadas, mas não é muito grande. Em vez disso você vai querer usar uma função de "núcleo" que as médias-los juntos em uma maneira não-intuitiva.

Mathwise, descartando tudo fora da banda de baixa frequência é a multiplicação por uma função de caixa no espaço de freqüência. O (inverso) de transformada de Fourier espiras pontuais de multiplicação em uma convolução do (inverso) transformadas de Fourier das funções, e vice-versa. Então, se queremos trabalhar no domínio do tempo, é preciso executar uma convolução com o (inversa) com transformada de Fourier da caixa de função. Este acaba por ser proporcional à função "sinc" (pecado at) / at, onde a é a largura da caixa no espaço de freqüência. Então, em cada 4ª posição (desde que você está downsampling por um fator de 4) você pode adicionar até os pontos perto dele, multiplicado pelo pecado (a dt) / um descolamento, onde dt é a distância no tempo para esse local. Como nas proximidades? Bem, isso depende de quão bom você quero que soe. É comum a ignorar tudo fora o primeiro zero, por exemplo, ou apenas tomar o número de pontos a ser a razão pela qual você está downsampling.

Finalmente, há a maneira mijo-pobre (mas rápido) de apenas descartando a maioria das amostras, mantendo apenas o zeroth, o quarto, e assim por diante.

Honestamente, se ele se encaixa na memória, eu recomendo apenas ir a rota DFT. Se ele não usar um dos pacotes de filtro de software que os outros têm recomendado para construir o filtro para você.

Recentemente, deparei com BruteFIR que podem já fazer parte do que você está interessado?

Você tem que aplicar filtro passa-baixa (remoção de freqüências acima de 5500 Hz) e depois aplicar dizimação (partem a cada amostra Nth, cada quarto no seu caso).

Para dizimação, FIR, não IIR filtros são usualmente empregados, porque eles não dependem de saídas anteriores e, portanto, você não tem a nada calcular para amostras descartadas. IIRS, em geral, depende de ambas as entradas e saídas, por isso, a menos que um tipo específico de IIR é usado, você teria que calcular cada amostra de saída antes de descartar 3/4 deles.

Apenas pesquisei um artigo de nível de introdução sobre o assunto: https: // www. dspguru.com/dsp/faqs/multirate/decimation

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