샘플에서 파형의 PDF 계산


27

얼마 전 저는 디지털 파형을 그리는 여러 가지 방법을 시도해 왔으며, 진폭 엔벌 로프의 표준 실루엣 대신 오실로스코프와 같이 더 많이 표시하는 방법 중 하나를 시도했습니다. 이것은 사인파와 구형파가 스코프에서 보이는 모습입니다.

여기에 이미지 설명을 입력하십시오

이를 수행하는 순진한 방법은 다음과 같습니다.

  1. 출력 이미지에서 오디오 파일을 수평 픽셀 당 하나의 청크로 나눕니다.
  2. 각 청크에 대한 샘플 진폭의 히스토그램을 계산합니다
  3. 히스토그램을 밝기로 픽셀 열로 플로팅

다음과 같이 생성됩니다. 여기에 이미지 설명을 입력하십시오

청크 당 많은 샘플이 있고 신호의 주파수가 샘플링 주파수와 관련이없는 경우에는 잘 작동하지만 그렇지 않은 경우에는 그렇지 않습니다. 예를 들어, 신호 주파수가 샘플링 주파수의 정확한 하위 배수 인 경우, 샘플은 각 사이클에서 항상 정확히 동일한 진폭에서 발생하며 히스토그램은 실제로 재구성 된 신호가이 포인트들 사이에 존재하더라도 몇 포인트가됩니다. 이 사인 펄스는 위의 왼쪽만큼 매끄러 워야하지만 정확히 1kHz이기 때문에 샘플이 항상 같은 지점에서 발생하기 때문이 아닙니다.

여기에 이미지 설명을 입력하십시오

포인트 수를 늘리기 위해 업 샘플링을 시도했지만 문제가 해결되지 않고 경우에 따라 부드럽게 처리하는 데 도움이됩니다.

제가 정말로 원하는 것은 디지털 샘플 (진폭 대 시간)에서 연속 재구성 된 신호 의 실제 PDF (확률 대 진폭) 를 계산하는 방법 입니다. 이 알고리즘을 사용할 알고리즘을 모르겠습니다. 일반적으로 함수의 PDF는 역함수 의 파생물입니다 .

sin (x)의 PDF :ddxarcsinx=11x2

그러나 역수가 다중 값 함수 인 파도에 대해 이것을 계산 하는 방법이나 빨리하는 방법을 모르겠습니다 . 그것을 가지 로 나누고 각각의 역수를 계산하고 미분을 취하여 모두 합산합니까? 그러나 그것은 매우 복잡하며 아마도 더 간단한 방법이있을 것입니다.

이 "보간 된 데이터의 PDF"는 GPS 트랙의 커널 밀도 추정을 시도한 시도에도 적용됩니다. 링 모양이어야하지만 샘플 만 보았고 샘플 간의 보간 점을 고려하지 않았기 때문에 KDE는 링보다 혹처럼 보였습니다. 샘플이 모두 알고 있다면 이것이 최선의 방법입니다. 그러나 샘플이 우리가 아는 전부는 아닙니다. 우리는 또한 샘플 사이에 경로가 있다는 것을 알고 있습니다. GPS의 경우 대역 제한 오디오와 같이 완벽한 Nyquist 재구성이 없지만 보간 기능에 약간의 추측이 있지만 기본 아이디어는 여전히 적용됩니다.


관심있는 다중 값 함수의 예가 있습니까? 실제 데이터에 가장 적합한 분기 컷을 따라 평가해야 할 것입니다.
Lorem Ipsum

그런 종류의 줄거리를 그리는 방법에 더 관심이 있습니까? 아니면 줄거리가 PDF 계산에 대한 질문에 대한 동기 부여입니까?
datageist

@yoda : 음, 사인파에 대한 위의 기능은 각 반주기가 다음과 같은 PDF를 갖기 때문에 반주기 만 취하고 미분을 취하고 미분을 취함으로써 발견됩니다. 그러나 임의의 전체 오디오 신호에 대한 가치를 얻으려면 그 가정을 할 수 없습니다. 나는 그것을 "분기 컷"으로 나누고 각각의 PDF를 차례로 가져 와서 모두 합쳐야한다고 생각합니까?
endolith

@datageist : 흠. 그런 종류의 줄거리를 그리는 방법에 관심이 있지만 그 종류의 줄거리 PDF입니다. 동일하거나 매우 유사한 결과를 생성하는 바로 가기는 괜찮습니다.
endolith

@ endolith, 예, 이해합니다. 실제로 강조에 대한 질문 (즉 어떤 종류의 지름길이 합리적입니까).
datageist

답변:


7

원래 속도의 몇 배로 보간합니다 (예 : 8x 오버 샘플링). 이를 통해 부분 선형 신호를 가정 할 수 있습니다. 이 신호는 무한 분해능, 파형의 연속 sin (x) / x 보간에 비해 오류가 거의 없습니다.

오버 샘플링 된 모든 값 에는 한 값에서 다음 값까지 연속적인 선이 있다고 가정합니다 . 사이의 모든 값을 사용하십시오 . 이것은 y1에서 y2까지 하나의 얇은 수평 슬라이스를 제공하여 임의의 해상도 PDF로 누적됩니다. 각각의 직사각형 확률 슬라이스는 1 / n 샘플 영역으로 스케일되어야합니다.

샘플 자체가 아닌 샘플 사이의 선을 사용하면 샘플링주기와 파형 사이에 근본적인 관계가있는 경우에도 "스파이 키"PDF를 방지 할 수 있습니다.


선형 보간 히스토그램에 대한 함수를 작성했지만 도피입니다. 이에 대한 기존 코드를 알고 있습니까?
endolith

선형 보간은 오버 샘플링 없이도 대부분의 파형에 큰 차이를 만듭니다. 1kHz 사인은 대부분 997Hz 사인과 비슷합니다. 샘플 값에 수평선 만있는 것이 아니라 이제는 그 사이의 수평 색상 밴드입니다. 오버 샘플링을 사용하면 밴드도 스무딩됩니다. FFT 리샘플링과 인접한 청크와 일부 오버랩을 사용하면 실제 샘플 간 피크에 도달 할 수 있습니다. 보간 된 히스토그램 코드를 더 빠르게
만들어야합니다

나는 이것을 위해 내 스크립트를 완전히 다시 작성했으며, 이번에는 히스토그램과 앤티 앨리어싱을 얻었습니다. gist.github.com/endolith/652d3ba1a68b629ed328
endolith


7

내가 함께 할 것은 본질적으로 Jason R의 "랜덤 리 샘플러"이며, 이는 결국 요다의 확률 적 샘플링의 사전 샘플링 된 신호 기반 구현입니다.

각 두 샘플 사이의 임의의 점에 간단한 입방 보간법을 사용했습니다. 프리미티브 신디사이저 사운드 (비 대역 포화 된 정사각형 신호 + 고조파에서 사인까지 감소)는 다음과 같습니다.

무작위 재 샘플링 된 신디사이저 PDF

더 높은 샘플링 버전과 비교해 봅시다.

여기에 이미지 설명을 입력하십시오

샘플링 속도는 같지만 보간은없는 이상한 것입니다.

여기에 이미지 설명을 입력하십시오

이 방법의 주목할만한 아티팩트는 정사각형 도메인의 오버 슈트이지만 실제로는 sinc 필터링 된 신호의 PDF (내 신호는 대역이 제한되지 않음)가 어떻게 보이고인지되는 음량을 훨씬 더 잘 나타냅니다. 오디오 신호 인 경우 피크보다

코드 (하스켈) :

cubInterpolate vll vl v vr vrr vrrr x
    = v*lSpline x + vr*rSpline x
      + ((vr-vl) - (vrr-vll)/4)*ldSpline x
      + ((vrr-v) - (vrrr-vl)/4)*rdSpline x
     where lSpline x = rSpline (1-x)
           rSpline x = x*x * (3-2*x)
           ldSpline x = x * (1 + x*(x-2))
           rdSpline x = -ldSpline (1-x)

                   --  rand list   IN samples  OUT samples
stochasticAntiAlias :: [Double] -> [Double] -> [Double]
stochasticAntiAlias rs (lsll:lsl:lsc:lsr:lsrr:[]) = []
stochasticAntiAlias (r:rLst) (lsll:lsl:lsc:lsr:lsrr:lsrrr:t)
    = ( cubInterpolate lsll lsl lsc lsr lsrr lsrrr r )
          : stochasticAntiAlias rLst (lsll:lsl:lsc:lsr:lsrr:lsrrr:t)

rand list [0,1] 범위의 임의 변수 목록입니다.


1
굉장해 보인다. 하스켈 코드 +1
datageist

예, 샘플 값을 초과 해야 합니다. 실제로 최대 픽셀뿐만 아니라 최대 샘플 간 피크를 기반으로 각 픽셀 열의 피크 값도 다르게 그릴 수 있습니다. flic.kr/p/7QAScX 와 같은 파형은 이것이필요한지를 보여줍니다.
endolith

"더 높은 샘플링 버전"이란 업 샘플링되었지만 여전히 균일하게 샘플링되었음을 의미합니까? 그리고 그것은 파란색 점입니까?
endolith

1
@endolith 처음에는 더 높은 샘플링 속도로 계산 된 원래의 파형입니다. 본질적으로 파란색 점은 192 kHz로 샘플링 된 사운드를 나타내고, 가장 아래쪽의 노란색 점은 순진한 다운 샘플을 24 kHz로 나타냅니다. 위의 노란색 점은 stochasticAntiAlias이것입니다. 그러나 더 높은 샘플링 버전은 두 경우 모두 실제로 균일 한 비율입니다.
leftaroundabout

5

귀하의 접근 방식은 이론적으로 정확하지만 (단조가 아닌 함수의 경우 약간 수정해야 함) 일반 함수의 역수를 계산하는 것은 매우 어렵습니다. 말할 수 있듯이 지점 지점 및 지점 컷을 처리해야하지만 가능한 지점은 아닙니다.

이미 언급했듯이, 정규 샘플링은 동일한 포인트 세트를 샘플링하므로 샘플링하지 않은 지역 (나일 퀴 스트 기준이 충족 되더라도)에서 좋지 않은 추정치에 매우 취약합니다. 이 경우 더 오랜 기간 동안 샘플링해도 도움이되지 않습니다.

일반적으로 확률 밀도 함수 및 히스토그램을 처리 할 때는 정규 샘플링보다 확률 적 샘플링의 관점에서 생각하는 것이 훨씬 좋습니다 (소개는 링크 된 답변 참조). 확률 적으로 샘플링하면 모든 포인트가 "적중"할 가능성이 동일하며 PDF를 훨씬 더 잘 평가할 수 있습니다.

f(x)=sin(20πx)+sin(100πx)fs=1000fN=1001000 초당 샘플 (균일 분포) (다른 의미를 의미하기 때문에 Hz를 사용하지 않습니다)은 30 초 동안 오른쪽에 플롯을 표시합니다 (동일 비닝).

잡음이 있지만 오른쪽에있는 것보다 실제 PDF에 대한 근사치가 훨씬 낫다는 것을 쉽게 알 수 있습니다. 여러 간격에서 0을 표시하고 다른 경우에는 큰 오류를 표시합니다. 더 긴 관측 시간을 가짐으로써 오른쪽에있는 것의 차이를 줄일 수 있으며, 결국 큰 관측치의 한계에서 정확한 PDF (검은 점선)로 수렴됩니다.

여기에 이미지 설명을 입력하십시오


1
"일반 함수의 역수를 계산하는 것은 매우 어렵습니다."글쎄, 이것은 일련의 샘플과 같은 함수가 아니므로 역수를 찾는 것은 단지 샘플의 x와 y 좌표를 교환 한 다음 적합하도록 리샘플링하는 것입니다. 새로운 좌표계 어쨌든 샘플링을 변경할 수 없습니다. 우리는 균일 한 샘플링을 사용하여 생성 된 기존 데이터에 대해 이야기하고 있습니다.
endolith

4

커널 밀도 추정

파형의 PDF를 추정하는 한 가지 방법은 커널 밀도 추정기 를 사용하는 것 입니다.

이것은 모든 샘플 과 커널 함수 (예 : 가우시안), 를 가져 와서 (Dirac 델타) PDF의 추정치를 제공하기 위해 :x(n)K(x)δ(xx(n))P^

P^(x)=n=0NK(xx(n))

업데이트 : 흥미로운 추가 정보.

대한 신호 이 있다고 가정하고 --- 말한 것처럼 --- 또한 ​​DFT 알 수 있습니다 .x(n)n=0,1,...,N1X(k)

X(k)=n=0N1x(n)eȷ2πnk/N

따라서 는 의 계수입니다 .X(k)eȷ2πnk/N

x(n)=1Nk=0N1X(k)eȷ2πnk/N

따라서 각 푸리에 구성 요소의 모든 PDF를 함께 모으는 것이 무엇인지 추측 하십시오.

|X(k)|11x2

그러나 이는 의 위상이 의 덧셈에 기여 하는 방식을 고려하지 않습니다 .x ( n )X(k)x(n)

더 많은 생각이 필요했습니다!


나는 그것을 생각했지만 밀도 추정은 알려지지 않은 확률 밀도 함수 를 추정하는 데 사용됩니다 . 나이키 스트 샘플링 이론으로 인해 전체 파형이 정확히 알려져 있으며 정확한 확률 밀도 함수도 알 수 있어야합니다. 속도 대 정확성 트레이드 오프인지 추정하는 것이 좋지만 실제 PDF를 가져 오는 방법이 있어야합니다. 마찬가지로 각 샘플에 sinc 함수를 넣고 합산하여 재구성 된 파형을 만들 수 있습니다. sinc 함수의 PDF를 커널로 사용하여 PDF를 작성할 수 있습니까? 나는 그것이 그렇게 작동한다고 생각하지 않습니다.
endolith

마찬가지로, 이것이 신호 샘플이 샘플링 주파수의 하위 배수 인 문제를 해결한다고 생각하지 않습니다. 샘플 간 재구성 된 파형을 고려하지 않습니까? 간격을 메우기 위해 PDF의 각 지점을 흐리게 만듭니다. 샘플 간의 값을 고려하지 않기 때문에 GPS 추적의 커널 밀도 추정을 시도하는 것과 비슷한 문제가있었습니다.
endolith

4

귀하의 의견 중 하나에서 지적했듯이, 대역 제한 신호를 보간하는 sinc 함수의 샘플과 PDF 만 사용하여 재구성 된 신호의 히스토그램을 계산할 수 있다는 것이 매력적입니다. 불행하게도, sinc의 히스토그램에 신호 자체에있는 모든 정보가 없기 때문에 이것이 가능하지 않다고 생각합니다. 각 값이있는 시간 영역 위치에 대한 모든 정보가 손실됩니다. 이것은 스케일 및 시간 지연 버전의 sinc가 어떻게 합쳐 지는지를 모델링하는 것을 불가능하게합니다. 업 샘플링.

보간법이 최선의 선택이라고 생각합니다. 당신은 당신이 이것을하고 싶지 않은 몇 가지 문제를 지적했습니다.

  • 계산 비용 : 이것은 물론 사용하려는 특정 응용 프로그램에 따라 항상 상대적 관심사입니다. 수집 한 렌더링 갤러리에 게시 한 링크를 기반으로 오디오 신호를 시각화하기 위해이 작업을 수행하려고한다고 가정합니다. 실시간 또는 오프라인 응용 프로그램에 관심이 있는지 여부에 관계없이 효율적인 보간기를 프로토 타입하고 비용이 너무 많이 드는지 확인하는 것이 좋습니다. 다상 리샘플링 은 유연한 방법으로이 작업을 수행하는 좋은 방법입니다 (이성적인 요소를 사용할 수 있음).

  • 샘플링 주파수와 합리적으로 관련된 주기적 구성 요소에 대한 바이어스 : 이를 완전히 제거 할 수는 없지만 "이상한"요인으로 보간하여 다소 완화 할 수 있어야합니다. 4로 업 샘플링하는 대신 71/18 ( 예). 다소 복잡한 구조이지만 여전히 효율적으로 구현할 수 있습니다. 이렇게하면 샘플 속도와 관련된 주파수를 가진 구성 요소의 기간에 걸쳐보다 균일 한 샘플 분포가 제공됩니다. 또는 임의의 리샘플링 비율을 선택한 다음 와 같은 (대략) 비합리적인 숫자로 리샘플링 할 수있는 리샘플링 구성표를 사용하십시오 . 이것은 다항식 보간을 사용 하는 Farrow 보간기를 사용하여 효율적으로 수행 할 수 있습니다 .π


그러나 파형이 44.1 / π kHz이면 어떨까요? :) 그러나 이것은 좋은 조언입니다. 랜덤 리샘플링과 같은 것이 있습니까? 또는 실제로 완벽하게 작동하는 것은 비 균일하게 리샘플링하는 것입니다. 따라서 새로운 샘플은 x 차원에서 균일 한 간격이 아닌 y 차원의 빈에 완벽하게 맞습니다. 그렇게하는 방법이 있는지 확실하지 않습니다
endolith

2
Farrow 구조를 사용하여 "랜덤"리 샘플러를 쉽게 구현할 수 있습니다. 다항식 (주로 입방)을 사용하여 보간하여 임의의 분수 샘플 지연을 허용하는 방식입니다. 각 출력 (재 샘플링 된) 샘플에 대해 샘플링 간격의 의사 난수 비율로 증가 하는 NCO에 사용 된 것과 유사한 샘플 간 위상 누산기를 유지할 수 있습니다. 누산기의 값은 Farrow 보간 기의 입력으로 사용되어 각 출력에 대한 분수 지연의 양을 정의합니다.
Jason R

흠, 명확히하기 위해 Farrow는 일반적인 구형 다항식 보간의 프로세서 / 메모리 최적화 버전입니까?
endolith

1
예. 다항식 기반의 임의의 분수 지연을 구현하기위한 효율적인 구조 일뿐입니다.
Jason R

그러나 3 차 보간은 근사치 일뿐입니다. 진정한 인터 샘플 피크를 알고 싶습니다. 극단적 인 피크에서는 잘 작동하지 않는 것 같습니다 : stackoverflow.com/questions/1851384/… 실제로는 [..., -1, 1, -1, 1, 1, -1, 1, -1, ...]은 무한 샘플 간 피크를 생성하므로 실제로 이것이 얼마나 중요한지 잘 모르겠습니다.
endolith

0

히스토그램을 부드럽게해야합니다 (커널 방법을 사용하는 것과 비슷한 결과가 나타남). 스무딩을 정확히 수행하는 방법은 실험이 필요합니다. 아마도 보간에 의해 수행 될 수도 있습니다. 스무딩 외에도 샘플링 주파수가 입력에서 가장 높은 주파수보다 '상당히 더 높은'방식으로 파형을 업 샘플링하면 개선 된 결과를 얻을 수 있다고 생각합니다. 이는 사인파가 샘플링 주파수와 관련이있는 '까다로운'경우에 도움이되며 히스토그램의 일부 빈만 채워집니다. 충분히 높은 샘플링 속도로 촬영하면 스무딩없이 멋진 플롯을 얻을 수 있습니다. 따라서 어떤 종류의 스무딩과 결합 된 업 샘플링은 더 나은 플롯을 생성합니다.

플롯이 예상과 다른 1kHz 톤의 예를 제공합니다. 여기 내 제안이 있습니다 (Matlab / Octave 코드)

pixels_vertical = 100;
% This needs to be tuned to your configuration and acceptance
upsampling_factor = 16*(pixels_vertical/100); 
fs_original = 48000;
fsine = 1000; % in Hz
fs_up = upsampling_factor*fs_original;
duration = 1; % in seconds
x = sin(2*pi*fsine*[0:duration*fs_up]/fs_up);
period_in_samples = fs_up/fsine;
hist_points = linspace(-1,1,pixels_vertical);
istart = 1;
iend   = period_in_samples;
pixel_values = hist(x(istart:iend), hist_points);
% smooth pixel values
[b,a] = butter(2,0.2);
pixel_values_smooth = filtfilt(b,a,pixel_values);
figure;hold on;
plot(hist_points, pixel_values);
plot(hist_points, pixel_values_smooth,'r');

1000Hz 톤의 경우 여기에 이미지 설명을 입력하십시오

upsampling_factor 표현식을 원하는대로 조정하십시오.

여전히 귀하의 요구 사항이 정확히 100 % 확실하지 않습니다. 그러나 위의 업 샘플링 및 스무딩 원리를 사용하면 1kHz 톤 (Matlab으로 제작)에이를 얻을 수 있습니다. 원시 히스토그램에는 적중 횟수가 0 인 빈이 많이 있습니다.

여기에 이미지 설명을 입력하십시오


예, 실제로 알고리즘의 일부로 보간법이 필요합니다. 히스토그램은 재구성 된 파형이 아닌 개별 포인트이므로 히스토그램 만 스무딩하면 효과가 없습니다. 업 샘플링이 작동하는 유일한 방법은 수직 픽셀보다 많은 샘플이있는 지점까지 수행하는 것입니다.하지만 시간이 오래 걸리는 무차별 강제 방법입니다.
endolith

또는 실제로 보간하지 않고 출력에 대한 보간 효과 계산
endolith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.