STFT và DWT (Wavelets)


12

STFT có thể được sử dụng thành công trên dữ liệu âm thanh (ví dụ với tệp âm thanh .wav) để thực hiện một số sửa đổi trong miền tần số (ví dụ: loại bỏ nhiễu).
Với N=441000(tức là 10 giây với tốc độ lấy mẫu fs=44100), windowsize=4096, overlap=4, STFT sản xuất approximatively một 430x4096mảng (lần đầu tiên phối hợp: khung thời gian, thứ hai phối hợp: bin tần số). Sửa đổi có thể được thực hiện trên mảng này và việc xây dựng lại có thể được thực hiện với chồng chéo (*).

Làm thế nào có thể làm một điều tương tự với wavelet ? (DWT), tức là có được một mảng hình dạng tương tự a x b, với acác khung thời gian và bthùng tần số, thực hiện một số sửa đổi trên mảng này và cuối cùng, có phục hồi tín hiệu không? Làm sao ? Wavelet tương đương với chồng chéo là gì? Các hàm Python có liên quan gì ở đây (tôi chưa tìm thấy một ví dụ dễ dàng về sửa đổi âm thanh với pyWavelets...)?

(*): Đây là khung STFT có thể được sử dụng:

signal = stft.Stft(x, 4096, 4)    # x is the input
modified_signal = np.zeros(signal.shape, dtype=np.complex)

for i in xrange(signal.shape[0]):    # Process each STFT frame
    modified_signal[i, :] =  signal[i, :] * .....  # here do something in order to
                                                   # modify the signal in frequency domain !
y = stft.OverlapAdd(modified_signal, 4)   # y is the output

Mục tiêu là tìm ra một khung tương tự với wavelet.


Một nhận xét phụ: thực hiện kiểu "lọc" đó trên STFT là một ý tưởng thực sự tồi tệ. Đó không phải là một cách tuyệt vời để làm hầu hết những điều mà bạn thực sự muốn làm. Bạn thực sự đang cố gắng để đạt được điều gì?
Peter K.

Lưu ý rằng PyWavelets chỉ dành cho biến đổi wavelet rời rạc. Nếu bạn muốn thực hiện các công cụ giống như STFT, bạn sẽ dễ dàng hiểu được biến đổi wavelet liên tục hơn, chẳng hạn như biến đổi Q không đổi, là biến đổi Gabor, về cơ bản giống như biến đổi sóng con liên tục Morlet phức tạp , nhưng được thiết kế để không thể đảo ngược: grrrr.org/research/software/nsgt
endolith

1
(câu hỏi này được hồi sinh bởi "Cộng đồng".) theo ý kiến ​​của tôi, các sóng nhỏ chồng lên nhau và thêm vào theo cách rất giống với STFT. vì vậy tôi không hiểu bản chất của câu hỏi.
robert bristow-johnson

Có nhiều chi tiết cần thiết?
Laurent Duval

Câu trả lời:


4

Biến đổi Fourier thời gian ngắn nói chung là một biến đổi dự phòng, thường được thực hiện với cùng một mẫu con trên mọi tần số. Nếu cửa sổ được chọn tốt, nó đã hoàn tất: bạn có thể đảo ngược nó và khôi phục bất kỳ tín hiệu ban đầu nào.

Vì nó là dư thừa và đầy đủ, nó có nhiều nghịch đảo hoàn hảo. Nó có thể được thực hiện và hiểu bằng cách sử dụng các công cụ chung hơn: (ngân hàng lọc) phức tạp. Đưa ra một loại cửa sổ và độ dài cộng với sự chồng lấp cung cấp cho bạn một ngân hàng bộ lọc phân tích mà bạn có thể tính toán xem nó có khả nghịch hay không. Nếu có, bạn có thể tính toán nghịch đảo tự nhiên và cũng được tối ưu hóa nghịch đảo . Bổ sung chồng chéo chỉ là một trong nhiều nghịch đảo tiềm năng, có thể là phổ biến nhất, thường hạn chế lựa chọn cửa sổ.

Các biến đổi wavelet rời rạc tiêu chuẩn cũng là các ngân hàng bộ lọc, với sự khác biệt là việc lấy mẫu con không giống nhau ở mỗi dải tần số (hoặc tỷ lệ đúng hơn). Điều này biến thành chiều dài không đồng đều cho mỗi quy mô. Tuy nhiên, có tồn tại các triển khai wavelet dự phòng mang lại "một mảng hình chữ nhật" các hệ số bạn có thể làm việc với. Các sơ đồ được biết đến nhiều nhất được gọi dưới các tên khác nhau: sóng con bất biến hoặc thời gian bất biến , bước sóng không xác định, biến đổi bước sóng tĩnh(SWT), và đôi khi quay vòng theo chu kỳ. Tái cấu trúc tiêu chuẩn của nó bao gồm các bước tương tự như bổ sung chồng chéo, ngoại trừ chúng được "nhúng" nhiều hơn do các yếu tố lấy mẫu khác nhau trên quy mô. Bạn có thể sử dụng chúng với bất kỳ wavelet rời rạc từ thư viện, hoặc thậm chí bằng cách thiết kế wavelet của riêng bạn. Lý do là các sóng nhỏ rời rạc tiêu chuẩn được thiết kế với ý định không dư thừa, điều này hạn chế sự lựa chọn của sóng con. Với sự dư thừa, sự lựa chọn wavelet của bạn tăng lên, vì các ràng buộc phải hoàn thành ít nghiêm ngặt hơn. Hình đại diện "tối thượng" là biến đổi wavelet liên tục, thừa nhận "gần như" mọi sóng con tổng hợp nghịch đảo. Câu cuối cùng của tôi khá tệ hại, tôi hy vọng bạn hiểu ý nghĩa: khi một ma trận vuông không thể đảo ngược, nó chỉ có một nghịch đảo. Khi ma trận "hình chữ nhật" bị đảo ngược theo cách tổng quát,

Dường như có một con trăn thực hiện Biến đổi Wavelet Stationary . Bạn có thể tìm thấy một vài tài liệu tham khảo trong 2.3.4. Dịch sóng bất biến chương của bài báo được liên kết .

Nó thường mạnh mẽ hơn nhiều để phát hiện, khử nhiễu hoặc phục hồi trong các ứng dụng thực tế (địa vật lý, thử nghiệm không phá hủy, siêu âm, rung động).


"Dự phòng" có nghĩa là "có nhiều thông tin trong đầu ra hơn mức cần thiết để tái tạo đầu vào"?
endolith

1
Chính xác. Nói chung đối với tín hiệu mẫu , bạn nhận được hệ số M > N sau khi chuyển đổi. Điều này có nghĩa là bạn có thể sử dụng điều này vì lợi ích của bạn. Ví dụ, bạn nhận được một số nghịch đảo tiềm năng, một số thực tế hơn những thứ khác. Quan trọng hơn, khi xử lý trong miền biến đổi (tăng cường, phát hiện, khử nhiễu, lọc thích ứng, phục hồi, giải mã, tách nguồn), bạn sẽ có được độ mạnh và độ nhạy thấp hơn với nhiễu. Điều này tạo thành "sự đa dạng" bổ sung trong dữ liệu được chuyển đổi. Khi chỉ được sử dụng đúng cách ...NM>N
Laurent Duval

3

Lý do bạn cần lưu / thêm chồng lấp để lọc với biến đổi Fourier thời gian ngắn về cơ bản là các hàm cơ bản được liên kết với các hệ số mà bạn nhận được được xác định trong một khoảng thời gian nhất định (trái ngược với một thời điểm duy nhất). Biến đổi Fourier bạn sử dụng để tính toán các hệ số mở rộng cũng thực hiện tích chập trên một miền tròn được xác định bởi chiều dài khung tín hiệu của bạn. Điều đó có nghĩa là hai điểm cuối của khung hình thực sự được xác định và đóng trong một vòng tròn. Đó là lý do tại sao bạn phải đảm bảo rằng các hàm cơ bản của các hệ số bạn chỉnh sửa không bao giờ ảnh hưởng đến cả hai đầu của khung bằng cách quấn quanh.

Wavelets không phải là người bản địa dịch thời gian và cũng không được tính toán bằng cách sử dụng tích chập tròn. Điều này có nghĩa là bạn không cần chồng chéo thêm hoặc lưu hoặc bất kỳ phương pháp nào khác liên quan đến các tác dụng phụ của tích chập tuần hoàn. Thay vào đó, các vectơ cơ sở sóng con chỉ là một cơ sở có thể để mô tả tín hiệu của bạn. Do đó, biến đổi wavelet (hoàn chỉnh, rời rạc, có thể trực giao) không có gì ngoài sự thay đổi cơ bản từ cơ sở miền thời gian sang cơ sở miền sóng con. Các thay đổi cơ bản có thể được đảo ngược (bằng cách áp dụng nghịch đảo của ma trận thay đổi cơ sở đã đưa bạn đến đó) và bạn có thể chuyển về miền thời gian.

Các tham số bạn đã đưa ra như kích thước cửa sổ, chồng lấp, tốc độ lấy mẫu đều không áp dụng được cho biến đổi wavelet. Điều duy nhất bạn cần là một wavelet mẹ. Nếu bạn muốn so sánh kết quả với đầu ra STFT của mình, bạn có thể chọn bất kỳ vectơ cơ sở STFT nào (tức là cửa sổ của bạn nhân với một sóng mang hàm mũ phức tạp) làm nguyên mẫu sóng con. Sau đó, bạn áp dụng biến đổi wavelet nhanh, nó sẽ phân tách tín hiệu của bạn thành một cây có tín hiệu được lọc và khử thông qua cao và thấp, cuối cùng trở thành hệ số của bạn. Mỗi hệ số được liên kết với một vectơ cơ sở sóng con và các tham số của nó (tỷ lệ, thời gian) hoặc (tần số, thời gian). Bạn có thể thao tác các hệ số và sau đó áp dụng biến đổi wavelet rời rạc ngược. Nó sẽ lấy các hệ số của bạn và chạy chúng thông qua ngân hàng bộ lọc tổng hợp để tạo lại tín hiệu.

Các quá trình này không tầm thường và có thể khó tiêu hóa cho người mới bắt đầu. Nhưng bạn sẽ có thể tìm thấy các thư viện / hộp công cụ cho nền tảng mà bạn lựa chọn thực hiện chuyển đổi wavelet nhanh và nghịch đảo của nó. Tuy nhiên, nếu bạn muốn nhận ra cơ sở sóng con của riêng mình, bạn sẽ phải rút ra các hệ số bộ lọc cho các ngân hàng bộ lọc phân tách và tổng hợp. Điều đó đòi hỏi một số lý thuyết sâu sắc, và có lẽ bạn sẽ phải nghiên cứu nó trước.

Có những hương vị khác của biến đổi wavelet, cụ thể là biến đổi wavelet liên tục hoạt động với cơ sở không đầy đủ. Việc tính toán chậm hơn và khó đảo hơn nhiều, do đó hiện tại nó không phải là một lựa chọn cho những gì bạn muốn làm.


1
Cảm ơn câu trả lời của bạn. Lý do chính khiến tôi cố gắng có khung mã là tôi luôn chú ý (từ thời thơ ấu đến vài năm trước khi tôi học xong tiến sĩ (tất nhiên không liên quan đến DSP, vì vậy tôi sẽ không hỏi vì vậy những người mới đặt câu hỏi ở đây!)) là việc thao túng một số vật liệu thực tế (ví dụ tín hiệu âm thanh trong DSP) giúp rất nhiều để hiểu lý thuyết sâu sắc. Những gì tôi muốn mã là : Audio sound -> Wavelet transform -> (do something on the array) -> Inversion -> Audio output. Với rất nhiều (làm một cái gì đó trên mảng), tôi chắc chắn tôi sẽ hiểu thêm một chút về cách hoạt động của wavelet.
Basj

1
@Basj, sau đó làm như tôi đã nói. Tìm một thư viện python hỗ trợ cả biến đổi wavelet nhanh và nghịch đảo của nó và sau đó chơi với cây hệ số được tạo. Chúc may mắn và vui vẻ!
Jazzmaniac

"Tất cả đều không áp dụng được cho biến đổi wavelet" Chúng có thể áp dụng cho CWT, phải không?
endolith

1

Có nhiều cách để xác định một cơ sở wavelet. Thông thường một wavelet trông giống như:

wx0,k0(x)=Aexp(ik0x)e(k0(xx0))

x0k0eAk

(x0,k0)(x0,k0)

Bởi vì kích thước của dữ liệu được chuyển đổi vượt quá tín hiệu, cơ sở sóng con sẽ không trực giao. Tức là sau đây sẽ là sai:

wk0,x0|wk0,x0=δ(x0,x0)δ(k0,k0)

Aw

x0,k0|wx0,k01k0wx0,k0|=identity

Nói cách khác, bạn có thể tái tạo lại tín hiệu một cách hoàn hảo chỉ bằng cách thêm các bước sóng cấu thành của nó.

"Sửa đổi" của bạn có thể chỉ cần được chèn vào tổng số trên:

my_filter=x0,k0|wx0,k0f(x0,k0)wx0,k0|

Cập nhật 2013-11-19: Thêm chi tiết thực hiện bên dưới theo yêu cầu.

f(x)

cx0,k0=wx0,k0|f

k0cx0,k0x0ffw0,k0cx0,k0

  • ff^
  • k01/4
    • f^w^0,k0
    • [kl,kr)w^0,k0
    • Áp dụng một biến đổi Fourier ngược cho điều đó.
    • exp(ixkl+kr2)cx0,k0x0

k0 by tuning the ratio in the geometric progression. The resolution in x0 is set by the length of the truncated spectrum, and will change depending on the bandwidth of w0,k0, which in turn depends on k0. The computational effort is one Fourier transform at high time resolution, plus one inverse Fourier transform for each k0 value at much lower time resolution. It works out about the same as STFT - maybe slower by some small factor that depends on the resolution you choose.

You can then modify the cx0,k0 as you see fit, and you can reconstruct the signal by reversing the above process, summing the spectra over k0 before finally doing an overall inverse Fourier transform.

Truncating spectra sometimes introduces normalisation problems, depending on precisely how your FFT is defined. I will not attempt to cover all the possibilities here. Normalisation is basically an easy problem. ;-)

The only part that remains is to choose a suitable wavelet envelope. It turns out it is easier to get w^x0,k0(k) right than to get wx0,k0(x) right. A suitable definition (from many possibilities) is:

w^x0,k0=Aexp(i(kk0)x0)exp((Qlog(k/k0))2)

in which Q is a dimensionless constant that selects the bandwidth of your filter, i.e. the frequency resolution of your wavelets, and A is chosen as necessary for normalisation. With this definition and sufficiently high resolution for k0, the overcompleteness condition holds, and the signal reconstruction will work.


1
Thank you for recalling these important points about wavelet theory, which are necessary indeed to understand how it works. But here the question would be more about building a framework code that would work on audio signal for example. The questions are : how to deal with these infinite sums, how to choose the windows (or rather mother-wavelet), how to do it using pyWavelets in Python (or another equivalent language, I'll translate into Python then), how to choose the parameters (like in my example for audio : sampling rate=44100, fft window = 4096, overlap=4, etc.)
Basj

Your notion of overcompleteness is not accurate. A basis being complete means, that the canonical projector onto the basis is the identity operator. But to write is as the sum of the outer product you need orthonormality. For overcompleteness you cannot have orthonormality, so that outer product decomposition does not work. But you can make it work by saying a basis is complete (and possibly overcomplete), if there are coefficients ak so that k|kakk|=Id
Jazzmaniac

hmm you have introduced a morlet wavelet, but all wavelet doesn't have fb and fc, so they might have constant K, also its impossible to make a DWT with morlet, bx its not orthogonal, actually I couldn't get a fine resolution for frequency estimation with DWT compare to the cwt or STFT @apt1002
Electricman

In addition, finding these coefficients ak is non trivial, and also non-unique. The linear dependence of the basis vector implies, that there are infinitely many possible such ak if the basis is overcomplete. That implies your "filter" is not well defined, in fact, it's not defined at all, because you don't know what you control with your filter function f. Each aspect of the signal is realized in many linear dependent wavelet basis vectors. So your theory falls apart.
Jazzmaniac

1
The best way to see if it works or not would be to provide a minimal code example (with pyWavelet for example it should be possible in a few lines I imagine) (I'll do itas well it once I understand it, I think I need a few more days reading about wavelets!)
Basj
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.