Tái thiết tín hiệu âm thanh từ Spectrogram


19

Tôi có một tập hợp các bài hát mà tôi đã trích xuất phổ độ lớn bằng cách sử dụng Cửa sổ Hamming với 50% trùng lặp. Sau khi trích xuất phổ, tôi đã thực hiện một số giảm kích thước bằng cách sử dụng Phân tích thành phần chính (PCA). Sau khi giảm nó xuống chiều thấp hơn, tôi đã xây dựng lại các phổ từ các chiều thấp hơn. Vì vậy, bây giờ, sẽ có một số lỗi giữa phổ ban đầu và phổ phổ được xây dựng lại. Tôi muốn chuyển đổi phổ này trở lại tín hiệu âm thanh và phát nó, để tôi có thể biết khi được tái tạo từ các kích thước thấp hơn, âm thanh phát ra như thế nào.

Có bất kỳ chức năng có sẵn trong Matlab nói. để chuyển đổi một Spectrogram cường độ thành tín hiệu âm thanh ??


2
Bạn thực sự muốn STFT và STFT nghịch đảo. "Spectrogram" chỉ là một tên cho bản đồ nhiệt độ lớn của STFT và chỉ riêng cường độ là không đủ để tái tạo tín hiệu. Nhìn vào mathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/ Cách ?
endolith

4
Để mở rộng nhận xét của @ endolith, thứ bạn đang thiếu khi bạn chuyển từ STFT sang spectorgram là thông tin pha, một thành phần quan trọng của biểu diễn miền tần số của tín hiệu của bạn.
Bjorn Roche

vậy có nghĩa là nếu tôi muốn xây dựng lại tín hiệu âm thanh gốc, tôi yêu cầu cả biên độ cũng như pha của STFT? Nhưng hào phóng để xây dựng các tính năng âm thanh, | S | biên độ của phức không là những gì được sử dụng và thông tin pha bị loại bỏ. Tôi đã thực hiện PCA trên phổ phổ mel mà tôi tính là M, là ma trận nhân bội của bộ lọc mel. nên làm thế nào để bạn tái tạo lại tín hiệu âm thanh cho X , xấp xỉ X có sau PCA? X=log(M|S|)X^
user76170

@endolith: Tôi đã thử sử dụng liên kết mà bạn đã đưa ra mathworks.com/matlabcentral/fileexchange/12902-dafx-toolbox/. Tôi đã sử dụng cả thông tin về pha và biên độ (ví dụ phức tạp làm đầu vào cho hàm trên). bằng cách này, tôi đã thử phát tín hiệu và nghe có vẻ chói tai. Lý do tại sao điều này xảy ra ? Sau đó, tôi đã tính toán định mức giữa tín hiệu gốc và tín hiệu thu được từ quy trình STFT nghịch đảo như trên và nó cho thấy giá trị rất lớn là 3,46 * 10 ^ 3. Bất cứ ý tưởng tại sao điều này xảy ra ?? S
dùng76170

@ user76170: choppy là do STFT chia tín hiệu thành các khung, đôi khi chồng chéo và bạn phải giải mã chúng theo cùng một cách chúng được tạo ra hoặc sẽ có sự gián đoạn ở mỗi một. Bạn đã sử dụng các hàm STFT và ISTFT từ liên kết đó chưa? Nhìn vào dạng sóng của tín hiệu choppy để bạn có thể thấy vấn đề là gì.
endolith

Câu trả lời:


15

Nếu biểu đồ phổ được tính là cường độ của bốn biến đổi thời gian ngắn từ các cửa sổ chồng lấp , thì biểu đồ phổ chứa một số thông tin pha.

Các công việc lặp lại sau đây thực hiện công việc:

xn+1=istft(Sexp(iangle(stft(xn))))

là biểu đồ phổ, stft là biến đổi Fourier thời gian ngắn, isft làbiến đổi Fourierngược thời gian ngắn.Sstftisft


Tôi muốn bình luận trực tiếp tại @edouard, nhưng tôi không có đủ danh tiếng. Có ai biết trong câu trả lời của anh ấy là gì không? Ngoài ra, làm thế nào để tôi khởi tạo x 0 ? Chỉ ngẫu nhiên? Là x n tín hiệu được tái tạo hoàn chỉnh ở lần lặp n hay chỉ là hệ số thứ n của x ? Cảm ơn. ix0xnnnthx
PR

1
@PR Đó là đơn vị số ảo, . 1
Peter K.

3

Tôi đã có một chút khó khăn để hiểu câu trả lời của @edouard, đó là làm điều đúng đắn. So sánh với /signals//a 43210/9031 , mà tôi đã sử dụng để thực hiện tái thiết của mình.

Lưu ý rằng là số ảo và x n là tín hiệu được xây dựng lại ở lần lặp thứ n . Bắt đầu với x 0 là một vectơ ngẫu nhiên về độ dài của tín hiệu âm thanh. Đối với tôi một vài lần lặp là đủ để có được một kết quả nghe có vẻ ổn. Lỗi tuyệt đối với tín hiệu ban đầu tuy nhiên khá cao. Ngoài ra, phổ được tạo ra mà tôi tạo ra từ tín hiệu được tái tạo, mặc dù hiển thị cùng các cấu trúc nói chung, có cường độ khá khác nhau.ixnnthx0


2

Bạn có thể sử dụng phổ phổ được xây dựng lại so với phổ gốc để thiết kế bộ lọc có đáp ứng cường độ biến đổi một phổ này sang phổ khác. Sau đó, bạn có thể áp dụng bộ lọc này cho dữ liệu miền thời gian ban đầu hoặc cho các FFT gốc để chồng chéo thêm / lưu bộ lọc tích chập nhanh.


|S||S||S^|

2
Một ma trận phổ là mất mát, vì vậy không thể được sử dụng để xây dựng lại. Nhưng nếu bạn có thể đảo ngược kỹ thuật biến đổi để tạo ra phổ phổ mong muốn của mình, bạn có thể áp dụng nó cho dữ liệu miền thời gian không mất mát ban đầu hoặc có thể cho FFT kết quả phức tạp ban đầu.
hotpaw2

S|S||S|

1
@ user76170 Cái dài và ngắn của nó là bạn yêu cầu STFT phức tạp trước khi bạn có thể tái tạo tín hiệu của mình. Nếu bạn chỉ có STFT cường độ, điều đó là không đủ. Có những trường hợp ngoại lệ cho quy tắc này, nhưng nhìn chung, bạn cần STFT phức tạp, không chỉ độ lớn.
Tarin Ziyaee

|S||S^|

-1

Sử dụng thuật toán Griffin-Lim để đảo ngược tín hiệu âm thanh từ phổ, nếu bạn không lo lắng về độ phức tạp tính toán.


Bạn có thể vui lòng mở rộng câu trả lời của bạn một chút không? Có lẽ thêm một bài báo hoặc liên kết đến thuật toán và một lời giải thích ngắn gọn về cách nó có liên quan đến câu hỏi này (?)
A_A

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn muốn xây dựng lại tín hiệu âm thanh từ một quang phổ mà không sử dụng thông tin pha ban đầu. Thuật toán Griffin-Lim yêu cầu ma trận phổ làm đầu vào và tái cấu trúc pha lặp. Bạn có thể tham khảo bài báo ieeexplore.ieee.org/document/1164317
Jitendra Dhiman

Cảm ơn bạn đã cho tôi biết. Chỉ cần làm rõ điểm này. Phản hồi này xuất hiện trên hàng đánh giá của tôi là "chất lượng thấp". Các tùy chọn mà tôi có về mặt "đánh giá" bao gồm cung cấp nhận xét cho "cải tiến". Để câu trả lời này phù hợp với loại câu trả lời thường gặp trong DSP.SE, nó sẽ phải đi một chút vào thuật toán Griffin Lim để cho thấy mức độ phù hợp với những gì OP đang hỏi. Bất kỳ chỉnh sửa nào trong tương lai, bạn có thể áp dụng trực tiếp vào câu trả lời của mình. Mục đích của việc này không phải là để thỏa mãn "tôi", mà là có một bộ câu trả lời chiếu sáng có ý nghĩa cho một câu hỏi
A_A

Câu trả lời tốt nhất là ở đây (sử dụng Griffin-Lim) trong trường hợp bạn không có thông tin FFT gốc. timsainb.github.io/ Từ
Artemi Krymski
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.