Tính toán PDF của dạng sóng từ các mẫu của nó


27

Cách đây một thời gian, tôi đã thử nhiều cách khác nhau để vẽ các dạng sóng kỹ thuật số , và một trong những điều tôi đã thử là, thay vì hình bóng tiêu chuẩn của đường bao biên độ, để hiển thị nó giống như một máy hiện sóng. Đây là hình dạng của sóng hình sin và hình vuông trên phạm vi:

nhập mô tả hình ảnh ở đây

Cách ngây thơ để làm điều này là:

  1. Chia tệp âm thanh thành một khối trên mỗi pixel ngang trong hình ảnh đầu ra
  2. Tính toán biểu đồ biên độ mẫu cho mỗi khối
  3. Vẽ biểu đồ theo độ sáng dưới dạng cột pixel

Nó tạo ra một cái gì đó như thế này: nhập mô tả hình ảnh ở đây

Điều này hoạt động tốt nếu có nhiều mẫu trên mỗi đoạn và tần số tín hiệu không liên quan đến tần số lấy mẫu, nhưng không thì khác. Ví dụ, nếu tần số tín hiệu là một tiểu chính xác của tần số lấy mẫu, thì các mẫu sẽ luôn xảy ra ở cùng biên độ chính xác trong mỗi chu kỳ và biểu đồ sẽ chỉ là một vài điểm, mặc dù tín hiệu được tái tạo thực tế tồn tại giữa các điểm này. Xung hình sin này phải trơn tru như bên trái, nhưng không phải vì nó chính xác là 1 kHz và các mẫu luôn xảy ra xung quanh cùng một điểm:

nhập mô tả hình ảnh ở đây

Tôi đã thử upampling để tăng số điểm, nhưng nó không giải quyết được vấn đề, chỉ giúp mọi việc suôn sẻ hơn trong một số trường hợp.

Vì vậy, điều tôi thực sự thích là một cách tính PDF thực (xác suất so với biên độ) của tín hiệu được tái tạo liên tục từ các mẫu kỹ thuật số của nó (biên độ so với thời gian). Tôi không biết sử dụng thuật toán nào cho việc này. Nói chung, PDF của một hàm là đạo hàm của hàm nghịch đảo của nó .

PDF của sin (x):ddxarcsinx=11x2

Nhưng tôi không biết cách tính toán này cho các sóng trong đó nghịch đảo là hàm đa giá trị hoặc làm thế nào để thực hiện nhanh. Chia nó thành các nhánh và tính toán nghịch đảo của từng loại, lấy các đạo hàm và tổng hợp tất cả chúng lại với nhau? Nhưng điều đó khá phức tạp và có lẽ có một cách đơn giản hơn.

"PDF dữ liệu nội suy" này cũng có thể áp dụng cho nỗ lực tôi đã thực hiện để ước tính mật độ hạt nhân của tuyến đường GPS. Đáng lẽ nó phải có hình chiếc nhẫn, nhưng vì nó chỉ nhìn vào các mẫu và không xem xét các điểm được nội suy giữa các mẫu, KDE trông giống như một cái bướu hơn là một chiếc nhẫn. Nếu các mẫu là tất cả những gì chúng ta biết, thì đây là cách tốt nhất chúng ta có thể làm. Nhưng các mẫu không phải là tất cả chúng ta biết. Chúng tôi cũng biết rằng có một đường dẫn giữa các mẫu. Đối với GPS, không có cấu trúc lại Nyquist hoàn hảo như đối với âm thanh được phân tách bằng dải, nhưng ý tưởng cơ bản vẫn được áp dụng, với một số phỏng đoán trong chức năng nội suy.


Bạn có một ví dụ về một hàm đa trị mà bạn quan tâm không? Có lẽ bạn sẽ phải đánh giá nó dọc theo một nhánh cắt có ý nghĩa nhất đối với dữ liệu vật lý của bạn.
Lorem Ipsum

Bạn có hứng thú hơn với những cách vẽ loại cốt truyện đó không, hay cốt truyện chỉ là động lực cho câu hỏi về tính toán PDF?
datageist

@yoda: Chà, chức năng trên cho sóng hình sin được tìm thấy bằng cách chỉ thực hiện nửa chu kỳ, đảo ngược và lấy đạo hàm, bởi vì mỗi nửa chu kỳ có cùng một tệp PDF như sau. Nhưng để có được giá trị cho toàn bộ tín hiệu âm thanh tùy ý, bạn không thể đưa ra giả định đó. Tôi nghĩ rằng bạn cần chia nó thành "cắt cành", lần lượt lấy tệp PDF và tổng hợp chúng lại với nhau?
endolith

@datageist: Hừm. Tôi quan tâm đến các cách để vẽ loại cốt truyện đó, nhưng loại cốt truyện đó PDF. Một phím tắt tạo ra kết quả tương tự hoặc rất giống nhau là ok.
endolith

@endolith, ồ, tôi hiểu rồi. Chỉ cần một câu hỏi về sự nhấn mạnh thực sự (tức là loại phím tắt nào là hợp lý).
datageist

Câu trả lời:


7

Nội suy đến nhiều lần so với tỷ lệ ban đầu (ví dụ: quá khổ 8 lần). Điều này cho phép bạn giả sử một tín hiệu tuyến tính từng phần. Tín hiệu này sẽ có rất ít lỗi so với độ phân giải vô hạn, nội suy sin (x) / x liên tục của dạng sóng.

Giả sử mỗi cặp giá trị được ghép có một dòng liên tục từ giá trị này sang giá trị tiếp theo. Sử dụng tất cả các giá trị giữa. Điều này cung cấp cho bạn một lát cắt ngang mỏng từ y1 đến y2 để được tích lũy thành một tệp PDF có độ phân giải tùy ý. Mỗi lát xác suất hình chữ nhật phải được chia tỷ lệ thành diện tích 1 / nsamples.

Việc sử dụng đường giữa các mẫu chứ không phải bản thân mẫu sẽ ngăn PDF "tăng đột biến", ngay cả trong trường hợp khi có mối quan hệ cơ bản giữa thời gian lấy mẫu và dạng sóng.


Tôi đã viết một hàm cho biểu đồ nội suy tuyến tính, nhưng nó tinh ranh. Bạn có biết mã hiện có cho điều này?
endolith

Phép nội suy tuyến tính tạo ra sự khác biệt rất lớn đối với hầu hết các dạng sóng, ngay cả khi không có sự chồng chéo. Bây giờ sin 1 kHz trông giống như sin 997 Hz. Thay vì chỉ là các đường ngang ở các giá trị mẫu, giờ đây là các dải màu nằm ngang giữa chúng. Với oversampling, các ban nhạc cũng được làm mịn. Với việc ghép lại FFT và một số chồng chéo với các đoạn liền kề, tôi có thể làm cho nó đạt đến các đỉnh giao nhau thực sự. Tôi cần phải làm cho mã histogram nội suy của tôi nhanh hơn, mặc dù ...
endolith

Tôi hoàn toàn viết lại kịch bản của mình cho điều này và tôi nghĩ rằng tôi đã có biểu đồ và khử răng cưa ngay lúc này: gist.github.com/endolith/652d3ba1a68b629ed328
endolith

Phiên bản mới nhất có tại github.com/endolith/scopeplot
endolith

7

Những gì tôi muốn đi về cơ bản là "bộ ghép ngẫu nhiên" của Jason R, mà đến lượt nó là một triển khai dựa trên tín hiệu được lấy mẫu dựa trên mẫu của ngẫu nhiên của yoda.

Tôi đã sử dụng phép nội suy bậc ba đơn giản đến một điểm ngẫu nhiên giữa mỗi hai mẫu. Đối với âm thanh tổng hợp nguyên thủy (phân rã từ tín hiệu giống như hình vuông không bão hòa + thậm chí hài hòa với hình sin), nó trông như thế này:

PDF tổng hợp ngẫu nhiên

Hãy so sánh nó với phiên bản lấy mẫu cao hơn,

nhập mô tả hình ảnh ở đây

và một cái lạ với cùng một mẫu nhưng không có nội suy.

nhập mô tả hình ảnh ở đây

Cổ vật đáng chú ý của phương pháp này là phần vượt quá trong miền giống như hình vuông, nhưng đây thực sự là bản PDF của tín hiệu được lọc chân thành (như tôi đã nói, tín hiệu của tôi không bị giới hạn) cũng sẽ trông giống và thể hiện độ ồn lớn hơn nhiều hơn các đỉnh, nếu đây là tín hiệu âm thanh.

Mã (Haskell):

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 là danh sách các biến ngẫu nhiên trong phạm vi [0,1].


1
Trông tuyệt. +1 cho mã Haskell.
datageist

Có, nó nên vượt quá các giá trị mẫu. Tôi thực sự đã lên kế hoạch để có một giá trị cực đại cho mỗi cột pixel, có thể được vẽ khác nhau, dựa trên các đỉnh xen kẽ tối đa và không chỉ trên các mẫu tối đa. Các dạng sóng như flic.kr/p/7QAScX cho thấy lý do tại sao điều này là cần thiết.
endolith

"Phiên bản lấy mẫu cao hơn" có nghĩa là nó bị xáo trộn, nhưng vẫn được lấy mẫu đồng đều? Và đó là những chấm màu xanh?
endolith

1
@endolith Đơn giản là dạng sóng ban đầu được tính theo tỷ lệ mẫu cao hơn ở vị trí đầu tiên. Về cơ bản giống như các điểm màu xanh biểu thị một âm thanh được lấy mẫu ở 192 kHz và các điểm màu vàng ở phía dưới đại diện cho một mẫu được thực hiện một cách ngây thơ đến 24 kHz. Các điểm màu vàng trên là stochasticAntiAliascủa điều này. Nhưng phiên bản lấy mẫu cao hơn thực sự là tỷ lệ đồng đều trong cả hai trường hợp.
leftaroundabout

5

Mặc dù cách tiếp cận của bạn là đúng về mặt lý thuyết (và cần được sửa đổi một chút cho các hàm không đơn điệu), nhưng rất khó để tính toán nghịch đảo của một hàm chung. Như bạn nói, bạn sẽ phải đối phó với các điểm rẽ nhánh và cắt giảm chi nhánh, điều này là có thể làm được, nhưng bạn thực sự không muốn.

Như bạn đã đề cập, các mẫu lấy mẫu thông thường có cùng một tập hợp các điểm và như vậy rất dễ bị ước tính kém ở các khu vực không lấy mẫu (ngay cả khi tiêu chí Nyquist được thỏa mãn). Trong trường hợp này, lấy mẫu trong một thời gian dài hơn cũng không giúp được gì.

Nói chung, khi xử lý các hàm mật độ xác suất và biểu đồ, nên nghĩ theo cách lấy mẫu ngẫu nhiên tốt hơn nhiều so với lấy mẫu thông thường (xem câu trả lời được liên kết để giới thiệu). Bằng cách lấy mẫu ngẫu nhiên, bạn có thể đảm bảo rằng mọi điểm đều có xác suất bị "đánh" như nhau và là cách tốt hơn để ước tính pdf.

f(x)=sin(20πx)+sin(100πx)fs=1000fN=1001000 các mẫu (phân phối đồng đều) mỗi giây (Tôi không sử dụng Hz ở đây, vì điều đó hàm ý khác) trong 30 giây cho âm mưu ở bên phải (cùng cách tạo thùng).

Bạn có thể dễ dàng thấy rằng mặc dù nó ồn ào, nhưng đó là một xấp xỉ tốt hơn nhiều so với PDF thực tế so với tệp bên phải hiển thị số không trong một số khoảng thời gian và một số lỗi lớn trong một số khác. Bằng cách có thời gian quan sát lâu hơn, bạn có thể đưa ra phương sai ở bên phải, cuối cùng hội tụ thành PDF chính xác (đường màu đen nét đứt) trong giới hạn của các quan sát lớn.

nhập mô tả hình ảnh ở đây


1
"Rất khó để tính toán nghịch đảo của hàm chung" Chà, đây không phải là một hàm nhiều như một loạt các mẫu, vì vậy việc tìm nghịch đảo chỉ là hoán đổi tọa độ x và y của các mẫu và sau đó lấy mẫu lại cho phù hợp hệ tọa độ mới. Tôi không thể thay đổi việc lấy mẫu. Chúng ta đang nói về dữ liệu tồn tại được tạo bằng cách sử dụng lấy mẫu thống nhất.
endolith

4

Ước tính mật độ hạt nhân

Một cách để ước tính PDF của dạng sóng là sử dụng công cụ ước tính mật độ hạt nhân .

x(n)K(x)δ(xx(n))P^

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

Cập nhật: Thông tin bổ sung thú vị.

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

Vì vậy, hãy đoán xem hậu quả của bạn là gì để kết hợp tất cả các tệp PDF của từng thành phần Fourier lại với nhau:

|X(k)|11x2

X(k)x(n)

Mặc dù vậy, cần nhiều suy nghĩ hơn!


Tôi nghĩ về điều đó, nhưng ước tính mật độ được sử dụng để ước tính hàm mật độ xác suất không xác định . Do định lý lấy mẫu Nyquist, toàn bộ dạng sóng được biết, chính xác và hàm mật độ xác suất chính xác cũng có thể biết được. Tôi ổn với ước tính nếu đó là sự đánh đổi tốc độ và độ chính xác, nhưng phải có cách để loại bỏ PDF thực sự ra khỏi nó. Giống như, một dạng sóng được xây dựng lại có thể được tạo ra bằng cách đặt một hàm chân tại mỗi mẫu và tổng hợp chúng lại với nhau. PDF có thể được tạo bằng cách sử dụng PDF của một hàm chân thành hạt nhân không? Tôi không nghĩ rằng nó hoạt động như vậy.
endolith

Giống như, tôi không nghĩ rằng điều này giải quyết vấn đề trong đó các mẫu tín hiệu là một phần phụ của tần số lấy mẫu. Nó không tính đến dạng sóng được tái tạo giữa các mẫu, phải không? Nó chỉ làm mờ từng điểm trong PDF để cố gắng điền vào các khoảng trống. Tôi gặp vấn đề tương tự với việc thử ước tính mật độ hạt nhân của dấu vết GPS, vì nó không tính đến các giá trị giữa các mẫu.
endolith

4

Như bạn đã chỉ ra trong một trong những bình luận của mình, sẽ rất hấp dẫn khi có thể tính toán biểu đồ của tín hiệu được tái tạo chỉ bằng cách sử dụng các mẫu và PDF của hàm chân có nội suy tín hiệu được giới hạn. Thật không may, tôi không nghĩ rằng điều này là có thể bởi vì biểu đồ của chân thành không có tất cả thông tin mà chính tín hiệu đó có; tất cả thông tin về các vị trí trong miền thời gian nơi mỗi giá trị gặp phải đều bị mất. Điều này khiến cho không thể mô hình hóa các phiên bản thu nhỏ và trễ thời gian kết hợp với nhau như thế nào, đó là điều bạn muốn để tính toán biểu đồ của phiên bản tín hiệu "liên tục" hoặc lấy mẫu mà không thực hiện lấy mẫu lên.

Tôi nghĩ rằng bạn còn lại với nội suy là lựa chọn tốt nhất. Bạn đã chỉ ra một vài vấn đề khiến bạn không muốn làm điều này, điều mà tôi nghĩ có thể được giải quyết:

  • Chi phí tính toán: Tất nhiên đây luôn là mối quan tâm tương đối, tùy thuộc vào ứng dụng cụ thể mà bạn muốn sử dụng. Dựa trên liên kết mà bạn đã đăng lên bộ sưu tập kết xuất mà bạn đã thu thập, tôi cho rằng bạn muốn làm điều này để trực quan hóa tín hiệu âm thanh. Cho dù bạn quan tâm đến điều này cho một ứng dụng ngoại tuyến hay thời gian thực, tôi sẽ khuyến khích bạn tạo nguyên mẫu một bộ nội suy hiệu quả và xem liệu nó có thực sự quá tốn kém hay không. Lấy mẫu lại polyphase là một cách tốt để thực hiện điều này linh hoạt (bạn có thể sử dụng bất kỳ yếu tố hợp lý nào).

  • π


Nhưng nếu dạng sóng ở 44,1 / π kHz thì sao? :) Đây là lời khuyên tốt, mặc dù. Có một điều như là thay đổi ngẫu nhiên? Hoặc thực sự, tôi đoán những gì sẽ hoạt động hoàn hảo sẽ được lấy mẫu lại không đồng đều, sao cho các mẫu mới khớp hoàn hảo trong các thùng theo chiều y, thay vì cách đều nhau trong chiều x. Không chắc chắn nếu có một cách để làm điều đó
endolith

2
Bạn có thể dễ dàng thực hiện một bộ cộng hưởng "ngẫu nhiên" bằng cách sử dụng cấu trúc Farrow. Đây là một sơ đồ cho phép độ trễ mẫu phân đoạn tùy ý bằng cách nội suy bằng cách sử dụng đa thức (thường là khối). Bạn có thể duy trì bộ tích lũy pha giữa các mẫu, tương tự như bộ tích lũy được sử dụng trong NCO , được tăng lên bởi các phân số giả ngẫu nhiên của một khoảng thời gian lấy mẫu cho mỗi mẫu đầu ra (được lấy mẫu lại). Giá trị của bộ tích lũy được sử dụng làm đầu vào cho bộ nội suy Farrow, xác định mức độ trễ phân đoạn cho mỗi đầu ra.
Jason R

Hmm, để làm rõ, Farrow chỉ là một phiên bản tối ưu hóa của bộ xử lý / bộ nhớ của phép nội suy đa thức cũ thông thường?
endolith

1
Vâng. Nó chỉ là một cấu trúc hiệu quả để thực hiện độ trễ phân đoạn tùy ý dựa trên đa thức.
Jason R

Nội suy hình khối chỉ là một xấp xỉ. Tôi muốn biết các đỉnh giao nhau thực sự và dường như nó không hoạt động tốt trên các đỉnh cực trị: stackoverflow.com/questions/1851384/ nam Trên thực tế, có vẻ như một chuỗi vô hạn có gián đoạn như [..., -1, Tuy nhiên, 1, -1, 1, 1, -1, 1, -1, ...] sẽ tạo ra một đỉnh giao nhau vô hạn, tuy nhiên, vì vậy tôi không chắc điều này sẽ quan trọng đến mức nào trong thực tế.
endolith

0

Bạn cần làm mịn biểu đồ (điều này sẽ mang lại kết quả tương tự như sử dụng phương pháp kernel). Chính xác làm thế nào để làm mịn phải được thực hiện cần thử nghiệm. Có lẽ nó cũng có thể được thực hiện bằng phép nội suy. Ngoài việc làm mịn tôi tin rằng bạn cũng sẽ nhận được kết quả được cải thiện nếu bạn lấy mẫu dạng sóng của mình theo cách sao cho tần số lấy mẫu 'cao hơn đáng kể' so với tần số cao nhất trong đầu vào của bạn. Điều này sẽ giúp ích trong trường hợp 'khó khăn' khi sóng hình sin có liên quan đến tần suất lấy mẫu theo cách chỉ một vài thùng trong biểu đồ được phổ biến. Nếu được đưa đến mức cực cao, tỷ lệ mẫu đủ cao sẽ cung cấp cho bạn các ô đẹp mà không cần làm mịn. Vì vậy, upampling kết hợp với một số loại làm mịn sẽ mang lại âm mưu tốt hơn.

Bạn đưa ra một ví dụ về âm 1kHz, trong đó cốt truyện không như bạn mong đợi. Đây là đề xuất của tôi (mã 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');

Đối với âm 1000Hz của bạn, bạn có được điều này nhập mô tả hình ảnh ở đây

Những gì bạn cần làm là điều chỉnh biểu thức upsampling_factor theo sở thích của bạn.

Vẫn không chắc chắn 100% chính xác những gì bạn yêu cầu. Nhưng sử dụng nguyên tắc tăng tốc và làm mịn ở trên, bạn sẽ có được điều này cho âm 1kHz (được làm bằng Matlab). Lưu ý rằng trong biểu đồ thô có nhiều thùng không có lượt truy cập.

nhập mô tả hình ảnh ở đây


Vâng, nó thực sự cần một số loại nội suy như là một phần của thuật toán. Làm mịn biểu đồ một mình sẽ không làm điều đó, bởi vì biểu đồ là các điểm riêng biệt, không phải là dạng sóng được xây dựng lại. Cách duy nhất để lấy mẫu sẽ hoạt động là nếu tôi làm điều đó đến mức có nhiều mẫu hơn so với các pixel dọc, nhưng đó là một phương pháp vũ lực nặng nề mất nhiều thời gian.
endolith

hoặc tính toán hiệu ứng của nội suy trên đầu ra mà không thực sự nội suy
endolith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.