Quais são as boas maneiras de detectar o recorte de sinal em uma gravação?

32

Dada uma gravação, preciso detectar se ocorreu algum recorte.

Posso concluir com segurança que houve um recorte se alguma (uma) amostra atingir o valor máximo da amostra ou devo procurar uma série de amostras subsequentes no nível máximo?

A gravação pode ser obtida em conversores A / D de 16 ou 24 bits e é convertida em valores de ponto flutuante que variam de . Se essa conversão assume a forma de uma divisão por ou , presumivelmente os picos negativos podem ser um pouco menores que -1, e as amostras com o valor -1 não são cortadas?2 15 - 1 2 23 - 11...121512231

Obviamente, sempre é possível criar um sinal especificamente para derrotar o algoritmo de detecção de recorte, mas estou vendo gravações de fala, música, ondas senoidais ou ruído rosa / branco.

Han
fonte
8
Lembre-se de que o nível de recorte nem sempre é o máximo digital. Se o circuito analógico (ou mesmo o lado analógico do ADC) tiver um nível de recorte um pouco menor que o máximo digital, ele será recortado mais cedo. Se ele gravar em analógico e passar por alguma filtragem, nem será uma linha reta. Quais cenários você precisa detectar?
Endolith
1
As gravações são feitas com um dispositivo de som para PC (geralmente conectado via USB). Principalmente, são respostas a um estímulo de varredura ou MLS e são usadas para calcular uma resposta de impulso da sala. Como não controlo o hardware, o recorte pode até ocorrer na saída do estímulo. Não pensei nisso antes, mas estou feliz que você tenha pensado nisso.
19711 Han

Respostas:

30

Eu estava no meio da digitação de uma resposta exatamente igual à de Yoda . Ele é provavelmente o mais confiável, mas propus uma solução diferente para que você tenha algumas opções.


Se você usar um histograma do seu sinal, provavelmente terá uma forma de sino ou triângulo, dependendo do tipo de sinal. Sinais limpos tendem a seguir esse padrão. Muitos estúdios de gravação adicionam um efeito de "volume" que causa um pequeno impacto perto do topo, mas ainda é um pouco suave. Aqui está um exemplo de uma música real de um grande músico:

Histograma

Aqui está o histograma de sinal que Yoda dá em sua resposta:

Histograma sem recorte

E agora o caso deles estarem cortando:

Histograma com recorte

Às vezes, esse método pode ser enganado, mas é pelo menos algo a ser jogado em sua bolsa de ferramentas para situações em que o método FFT não parece estar funcionando para você ou há muitos cálculos para o seu ambiente.

Kellenjb
fonte
2
Isso é um efeito incrível e louco. Muito interessante.
Kortuk
Estou feliz que você sugeriu esse método. Eu deveria ter incluído-lo eu mesmo ...
Pearsonartphoto
Digo isso especificamente porque esse parece ser o método mais implementável. É uma forma aplicada das outras opções fornecidas, mas parece que o sinal de "erro" é muito mais claro.
Kortuk
1
Poderia muito bem ter o valor absoluto do sinal em primeiro lugar e obter um suave histograma unilateral
endolith
Meus dedos estão coçando para tentar isso com meus sinais. Obrigado.
21711 Han
20

A resposta mais simples se você estiver lidando com gravações curtas é ouvi-la e detectar "pops" (som com ponta curta) na reprodução. No entanto, uma solução mais robusta é analisar o espectro de frequência da gravação.

Lembre-se de que quando um sinal é cortado em algum limite, localmente se assemelha a uma onda quadrada nas regiões cortadas. Isso introduz harmônicos mais altos no espectro de frequências que não estariam lá originalmente. Se o seu sinal é ilimitado por banda (a maioria dos sinais do mundo real) e você está amostrando bem acima da taxa de Nyquist, isso fica bem claro como o dia.

Aqui está um pequeno exemplo no MATLAB demonstrando isso. Aqui, eu crio um sinal ilimitado de banda com duração de 1s, amostrado em 1000Hz e, em seguida, prendo-o no meio ±0.8(veja o gráfico superior na figura abaixo)

time = 0:0.001:1;
cleanSignal = sin(2*pi*75*time).*chirp(time,50,1,200);
clippedSignal = min(abs(cleanSignal),0.8).*sign(cleanSignal);

insira a descrição da imagem aqui

Você pode ver claramente que o espectro de frequência da forma de onda original não cortada é limpo e chega a zero fora da largura de banda (canto inferior esquerdo), enquanto no sinal cortado, há uma distorção geral menor do espectro (esperado se cortada) e a maioria importante, maiores harmônicos / picos / contribuições diferentes de zero no espectro fora da largura de banda do sinal (canto inferior direito).

Geralmente, essa pode ser uma abordagem melhor, porque detectar o recorte observando os valores geralmente não é preciso, a menos que você tenha projetado o equipamento e saiba exatamente o valor do limite.

Lorem Ipsum
fonte
1
Alguns dos meus sinais (particularmente o MLS) vão até a frequência de Nyquist. Portanto, esse método provavelmente nem sempre é aplicável para mim.
21711 Han
@yoda Com os espectros em mãos, como dizer então que um espectro está "sujo", como você indicou? Que teste pode ser realizado?
Spacey
9

Um pouco disso depende do método de registro. Parece que você está usando apenas um conversor, o que simplifica um pouco as coisas.

Você deve procurar algo acima de algum limite e, especificamente, mais de um ponto ao lado do outro. Normalmente, os conversores A / D na verdade não leem seu valor máximo, a menos que você o teste com muita precisão, portanto, perceba que o valor máximo pode ser menor do que parece possível.

Dado seus parâmetros, eu procuraria sinais consecutivos acima de 0,98 ou abaixo de -98, com alguns ajustes para determinar qual deveria ser o limite ideal (eu não o traria abaixo de 0,9). Pode ser sensato detectar um no máximo, e outro próximo sobre algo como 0,8.

O motivo para ignorar uma medição específica é que é comum ocorrer picos que nada têm a ver com o sinal. Isso será reduzido no caso de você estar usando um bom conversor A / D. É provável que, se você estiver usando uma variedade de detectores ou uma imagem, alguns dos detectores estejam com defeito, potencialmente aparando frequentemente.

PearsonArtPhoto
fonte
Conselho muito prático aqui. Juntamente com a abordagem do @ Kellenjb, isso deve me dar o suficiente para começar a trabalhar em uma implementação.
21711 Han
3

MLS (sequências de tamanho máximo) são particularmente difíceis de analisar para recorte. Seu fator de crista (= pico / rms) é muito próximo a 1, que é até três dB menor que o de uma onda senoidal. Muitos conversores D / A são projetados para receber uma onda senoidal como o pior caso e um MLS reproduzido em amplitude total pode facilmente cortar o circuito de interpolação de saída de um D / A.

O próximo problema é que um MLS recortado parece quase idêntico a um não recortado, uma vez que as amplitudes são quase todas de + pico em primeiro lugar. Além disso, a análise do PDF não funciona, pois o PDF de um MLS é simplesmente dois grandes picos nas bordas.

Em uma medição típica da resposta ao impulso da sala, o ponto de recorte mais provável é realmente o D / A, o amplificador ou o alto-falante. Depois de atravessar a sala, parece muito menos um MLS e, portanto, é mais fácil avaliar o recorte com os métodos descritos acima.

Em quase todas as medições acústicas, o nível de ruído é determinado pelo ruído próprio do microfone ou pelo ruído de fundo e não pelo A / D. Portanto, não é muito importante otimizar o ganho de entrada no A / D e deixar amplo espaço para o cabeçote antes que o recorte (10dB ou mais) seja perfeitamente adequado.

Normalmente, é uma boa ideia medir com vários níveis diferentes de excitação e observar o SNR da medição. Em níveis baixos, o ruído acústico de fundo domina e em níveis altos, algo limita, comprime ou corta. O truque para fazer uma boa medição é encontrar um bom local no meio.

Hilmar
fonte