Há um tempo atrás, eu estava tentando maneiras diferentes de desenhar formas de onda digitais , e uma das coisas que tentei foi, em vez da silhueta padrão do envelope de amplitude, exibi-lo mais como um osciloscópio. É assim que uma onda senoidal e quadrada se parece em um escopo:
A maneira ingênua de fazer isso é:
- Divida o arquivo de áudio em um pedaço por pixel horizontal na imagem de saída
- Calcular o histograma das amplitudes da amostra para cada bloco
- Plote o histograma por brilho como uma coluna de pixels
Produz algo como isto:
Isso funciona bem se houver muitas amostras por bloco e a frequência do sinal não estiver relacionada à frequência de amostragem, mas não o contrário. Se a frequência do sinal for um submúltiplo exato da frequência de amostragem, por exemplo, as amostras sempre ocorrerão exatamente nas mesmas amplitudes em cada ciclo e o histograma será apenas alguns pontos, mesmo que o sinal reconstruído real exista entre esses pontos. Esse pulso senoidal deve ser tão suave quanto o esquerdo acima, mas não é porque é exatamente 1 kHz e as amostras sempre ocorrem nos mesmos pontos:
Tentei fazer upsampling para aumentar o número de pontos, mas isso não resolve o problema, apenas ajuda a facilitar as coisas em alguns casos.
Então, o que eu realmente gostaria é uma maneira de calcular o verdadeiro PDF (probabilidade versus amplitude) do sinal reconstruído contínuo de suas amostras digitais (amplitude versus tempo). Não sei qual algoritmo usar para isso. Em geral, o PDF de uma função é a derivada de sua função inversa .
PDF do sin (x):
Mas não sei como calcular isso para ondas em que o inverso é uma função com vários valores , ou como fazê-lo rapidamente. Dividi-lo em galhos e calcular o inverso de cada um, pegar as derivadas e somar todas juntas? Mas isso é bastante complicado e provavelmente existe uma maneira mais simples.
Este "PDF de dados interpolados" também é aplicável a uma tentativa que fiz de estimar a densidade do núcleo de uma trilha GPS. Deveria ter a forma de um anel, mas como ele estava apenas olhando as amostras e não considerando os pontos interpolados entre as amostras, o KDE parecia mais uma corcunda do que um anel. Se as amostras são tudo o que sabemos, é o melhor que podemos fazer. Mas as amostras não são tudo o que sabemos. Também sabemos que existe um caminho entre as amostras. Para o GPS, não existe uma reconstrução Nyquist perfeita como a do áudio com banda ilimitada, mas a idéia básica ainda se aplica, com algumas suposições na função de interpolação.
fonte
Respostas:
Interpole para várias vezes a taxa original (por exemplo, 8x sobre-amostragem). Isso permite que você assuma um sinal linear por partes. Este sinal terá muito pouco erro em comparação com a resolução infinita, interpolação contínua de sin (x) / x da forma de onda.
Suponha que cada par de valores superamostrados tenha uma linha contínua de um valor para o próximo. Use todos os valores entre. Isso fornece uma fatia horizontal fina de y1 a y2 a ser acumulada em um PDF de resolução arbitrária. Cada fatia retangular de probabilidade deve ser dimensionada para uma área de 1 / nsamples.
O uso da linha entre amostras em vez da própria amostra impede um PDF "pontudo", mesmo no caso de existir uma relação fundamental entre o período de amostragem e a forma de onda.
fonte
O que eu diria é essencialmente o "reamostrador aleatório" de Jason R, que por sua vez é uma implementação baseada em sinal pré-amostrado da amostragem estocástica de yoda.
Eu usei interpolação cúbica simples para um ponto aleatório entre cada duas amostras. Para um som de sintetizador primitivo (decaindo de um sinal quadrado saturado e sem banda ilimitada + até harmônicos para um seno), é assim:
Vamos compará-lo com uma versão de amostra mais alta,
e o estranho com a mesma amostra, mas sem interpolação.
O artefato notável desse método é o overshoot no domínio quadrado, mas na verdade é assim que o PDF do sinal filtrado por sinc (como eu disse, meu sinal não é ilimitado por banda) também se pareceria e representa a sonoridade percebida muito melhor que os picos, se este fosse um sinal de áudio.
Código (Haskell):
rand list
é uma lista de variáveis aleatórias no intervalo [0,1].fonte
stochasticAntiAlias
disso. Mas a versão com maior amostra é, de fato, uma taxa uniforme nos dois casos.Embora sua abordagem seja teoricamente correta (e precise ser levemente modificada para funções não monotônicas), é extremamente difícil calcular o inverso de uma função genérica. Como você diz, terá que lidar com pontos de ramificação e cortes de ramificação, o que é factível, mas você seriamente não gostaria.
Como você já mencionou, a amostragem regular faz a amostragem do mesmo conjunto de pontos e, como tal, é altamente suscetível a estimativas ruins em regiões onde não é amostrada (mesmo que o critério de Nyquist seja satisfeito). Nesse caso, a amostragem por um período mais longo também não ajuda.
Em geral, ao lidar com funções de densidade de probabilidade e histogramas, é uma idéia muito melhor pensar em termos de amostragem estocástica do que a amostragem regular (consulte a resposta vinculada para uma introdução). Ao fazer uma amostragem estocástica, você pode garantir que cada ponto tenha a mesma probabilidade de ser "atingido" e seja uma maneira muito melhor de estimar o pdf.
Você pode ver facilmente que, embora seja barulhento, é uma aproximação muito melhor do PDF real do que o da direita, que mostra zeros em vários intervalos e erros grandes em vários outros. Ao ter um tempo de observação mais longo, é possível reduzir a variação da direita, eventualmente convergindo para o PDF exato (linha preta tracejada) no limite de grandes observações.
fonte
Estimativa de densidade do kernel
Uma maneira de estimar o PDF de uma forma de onda é usar um estimador de densidade do kernel .
Atualização: informações adicionais interessantes.
Portanto, adivinhe o que você precisa para reunir todos os PDFs de cada componente Fourier:
Mais pensamento é necessário!
fonte
Como você indicou em um de seus comentários, seria atraente poder calcular o histograma do sinal reconstruído usando apenas as amostras e o PDF da função sinc que interpola sinais ilimitados de banda. Infelizmente, acho que isso não é possível porque o histograma do sinc não possui todas as informações que o sinal em si possui; todas as informações nas posições no domínio do tempo em que cada valor é encontrado são perdidas. Isso torna impossível modelar como as versões em escala e com atraso de tempo do sinc se somariam, o que você desejaria para calcular o histograma da versão "contínua" ou com amostragem ampliada do sinal sem realmente fazer o amostragem ascendente.
Acho que você fica com a interpolação como a melhor opção. Você indicou alguns problemas que o impediram de fazer isso, que eu acho que pode ser resolvido:
Despesas computacionais: é claro que sempre é uma preocupação relativa, dependendo do aplicativo específico para o qual você deseja usá-lo. Com base no link que você postou na galeria de renderizações coletadas, suponho que você queira fazer isso para a visualização de sinais de áudio. Se você está interessado nisso para um aplicativo em tempo real ou offline, recomendamos que você protótipo de um interpolador eficiente e veja se ele é realmente muito caro. A reamostragem polifásica é uma boa maneira de fazer isso de maneira flexível (você pode usar qualquer fator racional).
fonte
Você precisa suavizar o histograma (isso produzirá resultados semelhantes aos do método kernel). Exatamente como a suavização deve ser realizada, é necessário experimentar. Talvez isso também possa ser feito por interpolação. Além da suavização, acredito que você também obterá melhores resultados se fizermos uma ampliação de sua forma de onda de modo que a frequência de amostragem seja 'significativamente maior' do que a frequência mais alta da sua entrada. Isso deve ajudar no caso "complicado", em que uma onda senoidal está relacionada à frequência de amostragem, de modo que apenas alguns compartimentos no histograma sejam preenchidos. Se levada ao extremo, uma taxa de amostragem suficientemente alta deve fornecer gráficos agradáveis sem suavização. Portanto, a ampliação de amostras combinada com algum tipo de suavização deve gerar melhores plotagens.
Você dá um exemplo de um tom de 1kHz, onde a plotagem não é a esperada. Aqui está a minha proposta (código Matlab / Octave)
Para o seu tom de 1000Hz, você obtém
O que você precisa fazer é ajustar a expressão upsampling_factor de acordo com sua preferência.
Ainda não tem 100% de certeza exatamente quais são seus requisitos. Mas, usando o princípio acima de upsampling e suavização, você obtém isso para o tom de 1kHz (feito com o Matlab). Observe que no histograma bruto existem muitos compartimentos com zero de acertos.
fonte