Pergunta

Este é o meu "fim de semana" problema hobby.

Eu tenho alguns bem-amado formas de onda de ciclo único dos ROMs de um sintetizador clássico.

Estas são amostras de 8 bits (256 valores possíveis).

Porque eles são apenas 8 bits, o nível de ruído é bastante elevado. Isto é devido ao erro de quantização. erro de quantização é muito estranho. Ele mexe-se todas as frequências um pouco.

Eu gostaria de tomar esses ciclos e fazer versões de 16 bits "limpos" deles. (Sim, eu sei que as pessoas adoram as versões sujos, então eu vou deixar o interpolate usuário entre suja e limpa em qualquer grau que eles gostam.)

Parece impossível, certo, porque eu perdi a baixa de 8 bits para sempre, certo? Mas isso foi na parte de trás da minha cabeça por um tempo, e eu tenho certeza que eu posso fazê-lo.

Lembre-se que estas são formas de onda de ciclo único que só se repetem uma e outra para a reprodução, de modo que este é um caso especial. (Claro, o synth faz todos os tipos de coisas para fazer o interessante som, incluindo envelopes, modulações, filtros cross-fading, etc.)

Para cada amostra byte indivíduo, o que eu realmente sei é que ele é um dos 256 valores na versão de 16 bits. (Imagine que o processo inverso, onde o valor de 16 bits é truncado ou arredondados para 8 bits.)

A minha função de avaliação está a tentar obter o ruído mínimo. Eu deveria ser capaz de julgar que, com um ou mais FFTs.

teste exaustivo provavelmente levaria para sempre, para que eu pudesse dar uma baixa resolução de primeira passagem. Ou eu só empurrar aleatoriamente valores escolhidos aleatoriamente em torno (dentro dos valores conhecidos que iria manter a mesma versão de 8 bits) e fazer a avaliação e manter a versão mais limpo? Ou há algo mais rápido que posso fazer? Estou em perigo de cair em mínimos locais quando pode haver alguns mínimos melhor em outro lugar no espaço de busca? Eu tive isso acontecer em outras situações semelhantes.

Existem estimativas iniciais que eu posso fazer, talvez por olhar para os valores vizinhos?


Editar: Várias pessoas têm apontado que o problema é mais fácil se eu remover a exigência de que a nova forma de onda iria provar ao original. Isso é verdade. Na verdade, se eu estou apenas procurando por sons mais limpos, a solução é trivial.

Foi útil?

Solução

Indo com a abordagem na sua pergunta, gostaria de sugerir olhando em algoritmos de subida e similares.

http://en.wikipedia.org/wiki/Hill_climbing tem mais informações sobre ele eo sidebox tem links para outros algoritmos que podem ser mais adequadas.

AI é como a alquimia -. Nós nunca atingiu a meta final, mas muita coisa boa saiu ao longo do caminho

Outras dicas

Você poderia colocar sua amostra de 8 bits existente para o byte de alta ordem de sua amostra nova de 16 bits, e depois usar o byte baixo a fim de linear interpolate alguns novos 16 pontos de dados de bits entre cada amostra original de 8 bits.

Este seria, essencialmente, conectar uma linha reta de 16 bits entre cada uma de suas amostras de 8 bits originais, usando várias novas amostras. Soaria muito mais silencioso do que o que você tem agora, que é uma súbita, 8-bit salto entre as duas amostras iniciais.

Você também pode tentar aplicar algum filtragem low-pass .

Bem, eu esperaria algum FIR filtragem (IIR se você realmente precisa ciclos de processamento, mas FIR pode dar melhores resultados sem instabilidade) para limpar o ruído. Você teria que jogar com ele para obter o efeito desejado, mas o problema básico é suavizando as bordas afiadas no áudio criado por amostragem-lo em 8 resoluções bits. Eu daria uma grande luz a frequência central do áudio e fazer um filtro passa-baixa, e em seguida, ouvir para se certificar de que eu não fazê-lo soar "flat" com o filtro eu escolhi.

É embora difícil, não há tanta coisa que você pode fazer, 8 bits inferiores for perdida, o melhor que você pode fazer é aproximada-lo.

É quase impossível para se livrar do barulho que se parece com o seu sinal. Se você começar tweeking coisas em sua faixa de frequência que vai tirar o sinal de interesse.

Para upsampling, desde que você já está usando um FFT, você pode adicionar zeros ao final do sinal de domínio de frequência e fazer um FFT inverso. Isso preserva completamente a frequecy e fase de informação do sinal original, embora ele se espalha a mesma energia durante mais amostras. Se você transferi-lo 8bits ser um amostras de 16 bits primeiro, este não será um muito de um problema. Mas eu costumo chutá-la até por um fator de ganho inteiro antes de fazer a transformação.

Pete

Edit: Os comentários estão ficando um pouco longo, então eu vou mover alguns para a resposta.

Os picos na saída da FFT são picos de harmónicas causadas pelo quantificador. Eu tendo a pensar de forma diferente do que o nível de ruído. Você pode hesitar como alguém mencionou e eliminar a amplitude dos picos de harmônicos e achatar o ruído, mas você solta sobre todo o sinal para o ruído na parte plana do seu piso de ruído. Quanto à FFT está em causa. Quando você interpolar usando esse método, ele mantém a mesma energia e se espalha ao longo de mais amostras, o que reduz a amplitude. Então, antes de fazer o inverso, dar o seu sinal de mais energia por multipling por um fator de ganho.

Os sinais simples / senóides complexas, ou têm bordas duras? ou seja, triângulo, ondas quadradas, etc. Eu estou assumindo que eles têm continuidade de ciclo para ciclo, é que é válida? Se assim você também pode aumentar a resolução da FFT às frequências mais precisamente pontuais, aumentando o número de ciclos de forma de onda alimentadas à sua FFT. Se você pode identificar com precisão as frequências de usar, assumindo que eles são um pouco discreto, você pode ser capaz de recriar completamente o sinal pretendido.

A 16 bits para 8 bits via exigência truncagem irá produzir resultados que não correspondem à fonte original. (Assim, tornando encontrar uma resposta ideal mais difícil.) Normalmente, você iria produzir uma forma de onda ponto fixo tentando "pegar a correspondência mais próxima", que significa o arredondamento para o número mais próximo (trunking é uma operação de chão). Que é mais provável como eles foram originalmente gerada. Adicionando 0,5 (neste caso 0,5 é de 128) e, em seguida, trunking a saída que lhe permitem gerar resultados mais precisos. Se isso não é uma preocupação, em seguida, ok, mas definitivamente vai ter um efeito negativo sobre a precisão.

ATUALIZADO: Por quê? Porque o objetivo da amostragem de um sinal é para ser capaz de tão perto uma possível reproduzir o sinal. Se limite de conversão é definido negativamente sobre a amostragem de tudo que você está de erro é de um lado do sinal e não é bem distribuído e centrado sobre zero. Nesses sistemas você normalmente tentar maximizar o uso da faixa dinâmica availiable, especialmente se você tiver baixa resolução, como um ADC de 8 bits.

Banda versões limitadas? Se eles são filtrados em freqüências diferentes, eu suspeito que era para lhe permitir desempenhar o mesmo som com a distorções quando você foi muito longe do outro variação. Kinda como mipmapping em gráficos. Eu suspeito que os dois são o mesmo sinal com diferentes filtros aliasing aplicado, isso pode ser útil para reproduzir o original. Eles devem ser a mesma do sinal de base com diferentes convoluções aplicada.

Pode haver uma simples advantange abordagem tomada da periodicidade das formas de onda. Que tal se você:

  1. Faça uma forma de onda de 16 bits, onde as altas bytes são a forma de onda e os bytes baixos são zero - chame-x [n]

  2. .
  3. Calcular a transformação discreta de Fourier de x [n] = x [w].

  4. Fazer um sinal Y [w] = (dBMag (X [W])> Limiar)? X [W]: 0, onde dBMag (k) = 10 * log 10 (real (k) ^ 2 + imag (k) ^ 2), e Limiar é talvez 40 dB, com base em 8 bits sendo aproximadamente 48 gama dinâmica dB, e permitindo ~ 1,5 bits do ruído.

  5. Inverse transformar Y [w] para obter y [n], o seu 16 bit onda nova.

  6. Se y [n] não soa agradável, pontilhar-lo com algum nível de ruído muito baixo.

Notas:

A. Esta técnica só funciona nas formas de onda originais são exatamente periódica!

B. Passo 5 pode ser substituído por definir os "0" valores de ruído aleatório em Y [w] no passo 3, você tem que experimentar um pouco para ver o que funciona melhor.

Isso parece mais fácil (para mim pelo menos) do que uma abordagem de otimização. Mas y truncado [n] provavelmente não será igual a seus formas de onda originais. Eu não sei o quão importante essa restrição é. Eu sinto que esta abordagem irá gerar formas de onda que soam bem.

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