PyWavelets CWT: chuẩn hóa? Vs Scipy?
Có liên quan . Phương trình đang được thực hiện chuẩn hóa bằng sqrt(1 / scale):
$$ C_{a, b} = \frac{1}{\sqrt{a}} \sum_k s(k)\left( \int_{-\infty}^{k+1} \overline{\psi \left(\frac{t-b}{a} \right) }dt - \int_{-\infty}^{k} \overline{\psi \left(\frac{t-b}{a} \right) }dt \right) $$
vậy tại sao lại pywt._cwtlàm * sqrt (scale) ? Ngoài ra, nó đang chuẩn hóa như thế nào (L1, L2, v.v.)?
Chỉnh sửa : Sau khi xem xét cwt của Scipy , tôi nhận ra rằng nó đang thực hiện chính xác những gì tôi mô tả là "lý tưởng" trong câu trả lời, do đó nó giống như so sánh hai (ngoại trừ một vài chi tiết rõ ràng). Tôi không biết trong kịch bản nào thì thuật toán của pywt tốt hơn, nhưng nói chung - Scipy dễ dàng giành chiến thắng . Tôi đã mở một bài PR để giải quyết lỗ hổng quan trọng của pywt.
Edit2 : Tìm thấy một cạnh rõ ràng của pywt trên scipy ở nơi ít được mong đợi nhất: quy mô thấp . Mặc ở đây .
Sửa 3 : sau khi sửa chữa với mức thấp nhất precisiontrong pywt, tôi thực sự tìm thấy pywtưu việt hơn scipytrong tất cả các của một loạt các tín hiệu tổng hợp, nhưng squeezepy's luôn đánh bại cả hai. Thử nghiệm ở đây , với nhiều hơn nữa sắp tới.
Trả lời
Chúng ta hãy theo dõi toán học từ khi ấp đến khi giao hàng. Nó bắt đầu bằng psi, được thay đổi tỷ lệ morlet2(như được hiển thị trước đó ) ở một tỷ lệ$a=64$và $\sigma=5$:
$$ \psi = \psi_{\sigma}(t/a) = e^{j\sigma (t/a)} e^{-(t/a)^2/2} \tag{2} $$
được tích hợp và chuẩn hóa L1 : - (xem báo trước2 bên dưới)
$$ \psi = \psi_{\text{int}}(t) = \frac{1}{a} \int \psi_{\sigma}(t/a)\ dt \tag{3} $$
Tiêu chuẩn bị lệch bởi một hệ số vô hướng, nhưng điều quan trọng là nó giống nhau đối với các$a$; bạn có thể xác minh nó như vậy (đối với$a$, tăng giới hạn tích hợp). Lưu ý rằng đó là wavelet được chuẩn hóa L1, không phải wavelet tích hợp$\psi_\text{int}(t)$; sự phân biệt là điều cần thiết, như chúng ta sẽ thấy.
$\psi$ sau đó được biến đổi với tín hiệu $s$, và hữu hạn-sai phân và phủ định; từ đây , đây là:
$$ -\text{DIFF}(\text{conv}) = [s \cdot (\psi_{\text{int}}(t - 0) - \psi_{\text{int}}(t - 1)),\ ...] \tag{4} $$
Kiểm tra chặt chẽ, điều này tương đương với việc hoàn tác tích hợp trước đây, với một số khác biệt về số nhất định (sẽ giải quyết sau), vì vậy chúng tôi sẽ
$$ \psi = \frac{1}{a} \psi_{\sigma}(t/a) \tag{5} $$
Cuối cùng, * sqrt(scale):
$$ \boxed{\psi = \frac{1}{\sqrt{a}} \psi_{\sigma}(t/a)} \tag{6} $$
do đó cuối cùng được chuẩn hóa L2 . Chúng tôi có thể xác minh điều này trên một tín hiệu thử nghiệm; L2 thiên về biểu diễn biên độ / công suất đối với tần số thấp hơn, triệt tiêu tần số cao. Nếu ở trên là đúng, chúng tôi không chỉ có thể thấy điều này mà còn áp dụng bản sửa lỗi bằng cách xóa * sqrt(scale)khỏi mã:
Cảnh báo cụ thể về triển khai được thảo luận tiếp theo.
Mức độ tin cậy của việc chuẩn hóa trên các thang đo như thế nào? - Không tốt (- code2 ):
Ở bên phải, chúng tôi thấy trường hợp tốt nhất sử dụng số lượng mẫu giới hạn, bên trái chúng tôi thấy việc triển khai lấy mẫu lại. Rõ ràng là do độ phân giải vốn có của một số lượng nhỏ mẫu, định mức của chúng tôi không hoạt động tốt đối với các thang đo thấp - nhưng biến thể tính toán lại ít nhất duy trì một định mức trung bình gần như không đổi trên chúng.
Thú vị hơn, cái được lấy mẫu lại đột nhiên xuất hiện bậc hai sau $\log_2(a)=6$; thỏa thuận là gì? Nhớ lại "Nó bắt đầu ... trên quy mô$a=64$"; đây là khi chúng tôi lấy lại mẫu với nhiều mẫu hơn trong bản gốc ( int_psi):
của diffai
- Trong 1LR, chúng ta thấy
int_psiởscale=256đang lấy mẫu lại các giá trị giống nhau từint_psinhiều lần, biểu thị dưới dạng số không trongdiff(2LR). - Tiếp theo, chúng tôi bình phương các giá trị để có được ý tưởng về định mức L2 và so sánh với các giá trị được chuẩn hóa L2 trong 3LR; chúng tôi tìm thấy các giá trị định mức thổi các giá trị không có vũ khí ra khỏi nước. Điều này là quá mức, hay phù hợp?
- So sánh với tính toán lại ở cùng tỷ lệ; trong 4LR, ít nhất chúng ta cũng thấy hình dạng được tính toán lại - nó không còn là không đáng kể. Điều này cho thấy việc lấy mẫu lại được đánh giá quá cao biên độ wavelet, và vì trong tính toán chuẩn, điều này được bù đắp đáng kể bởi một nửa giá trị bằng 0 do
diffđó, đánh giá quá cao phải lớn.
Tuyệt vời như thế nào? Chúng ta có thể so sánh các biên độ đỉnh của wavelet trên các thang đo của không có vũ khí được lấy lại mẫu diff(int_psi_256)và tính toán lại w( morlet2/scale); định mức thay đổi cả hai theo cùng một hệ số ( *sqrt(scale)), sẽ không tạo ra sự khác biệt.
Chắc chắn là đủ, một lần nữa tại $a=64$chúng tôi thấy hành vi đáng phê phán; biên độ đỉnh của bão hòa được lấy mẫu lại ở mức tối thiểu, trong khi biên độ được tính toán lại tiếp tục giảm. Sự khác biệt ở$a=256$là quá đủ lớn (~ 12db = 4x, nếu bình phương -> 16x) để bù đắp các số không trong diffđó, do đó tại sao định mức L2 tăng lên.
Nhưng lưu ý rằng tiêu chuẩn L1 vẫn hoạt động tốt ở các quy mô cao hơn. Để tìm hiểu lý do tại sao, chúng ta phải so sánh chính xác tỷ lệ số không với yếu tố đánh giá quá cao. Chúng ta đã biết sau là 4x; trước đây, tôi đã lấy một vùng không phẳng (nếu không thì đó là số không) và tìm thấy tỷ lệ số không trên số mẫu: 0,75 . Có nghĩa là, 1 trong 4 giá trị khác 0 và mỗi giá trị lớn hơn 4 lần ... tỷ lệ chính xác cần thiết để giữ lại định mức L1.
Tỷ lệ số không đó không rõ ràng lắm so với các biểu đồ trên - vì vậy, thay vào đó, các dấu chấm:
Nếu diffhoàn tác cumsum, tại sao lại làm?
Câu hỏi hay. Trên thực tế, bằng cách loại bỏ cả hai, tôi thấy hiệu ứng suy giảm chất lượng (dây kéo) biến mất:
Nhưng một thứ khác cũng biến mất - thang tần số cao (bên trái) và dấu hiệu bị lật (tôi hoàn tác điều này bằng cách loại bỏ dấu trừ tại coef = -). Tôi đã bù đắp một phần điều này bằng cách thay thế * sqrt(scale)bằng 1 / sqrt(scale)(phải), nhưng điều đó đưa chúng ta đến trường hợp định mức L2 ( 1 / scalequá mức cần thiết) và là một sửa đổi vô căn cứ về mọi thứ được tìm thấy cho đến nay. Vậy có thực hiện được không? Chắc chắn, người ta có thể thực hiện mà không có int-diffđiệu nhảy, nhưng tôi sẽ không khám phá nó ở đây.
Lưu ý: định mức hiệu quả
Nhớ lại, convđược cắt bớt len(x), vì vậy toàn bộ wavelet có thể không tham gia vào quá trình tính toán, trong khi các phép tính trên giả định ngược lại. Giả định càng đúng thì càng lâu x- nhưng đây là điều sẽ xảy ra nếu len(x) == 512, với cùng một wavelet precision=10(2 ^ 10 = 1024 int_psi), được so sánh với wavelet được tính toán lại:
Một mớ hỗn độn! Cả hai đều bóp méo đáng kể, có thể ngụ ý rằng nó vốn có các thang âm đủ lớn được ghim vào các tín hiệu ngắn. Một cách giải quyết đơn giản là không đệm tín hiệu, nhưng tôi sẽ không bảo đảm cho nó nếu không hiểu các lưu ý (điều mà tôi không áp dụng cho wavelets, nhưng làm cho DFT ).
Hơn nữa, lưu ý rằng định mức không chỉ theo quy mô mà còn theo ca ($b$); ít wavelet nằm trong tín hiệu khi nó vừa đi vào trái ngược với khi trung tâm của nó ở trung tâm của tín hiệu.
Nhưng giữ nó theo tỷ lệ, tôi thú nhận là tôi đã gian lận trong ví dụ trước đó với $f=4$; ban đầu tôi chọn$f=1$, nhưng biểu đồ định mức L1 trông không đẹp, và tôi không hiểu tại sao. Kể từ bây giờ tôi làm, đây là cả L1 và L2 trên mỗi thang đo cho$f=1,64$:
So sánh với cốt truyện trước đó; lưu ý cách các chế độ bên trái (thang đo thấp) của cả hai định mức không bị ảnh hưởng, chỉ có các chế độ cao (tần số thấp) hiện lớn hơn nhiều (L2) và thấp hơn (L1), giống như mong đợi.
Lưu ý 2: * stepkhông thực hiện chuẩn hóa L1
Thay vào đó, nó là kết quả của diffviệc nhập wavelet tích hợp được lấy mẫu lại; các * stepchỉ đặt quy mô ban đầu chính xác, và có thể bỏ qua mà không làm mất tiêu. Điều này không xảy ra khi tính toán lại wavelet, hoặc lấy mẫu lại wavelet chưa được tích hợp.
(Lưu ý rằng được biên dịch lại scipy.signal.morlet2là L2-chuẩn hóa, nhưng chỉ vì nó được chuẩn hóa rõ ràng ; diff-resample- intlà "tự chuẩn hóa").