Vâng, nhiều người đã làm việc về phân tích tần số thời gian.
Cách tiếp cận "cắt dữ liệu của tôi thành các khối, thực hiện FFT trên mỗi khối" là một ý tưởng hay. Áp dụng "chức năng cửa sổ" trên mỗi khối, ngay trước khi thực hiện FFT, giúp tránh nhiều hiện vật. Cho phép chunk để chồng chéo cũng giúp. Sau những điều chỉnh đó, bạn kết thúc với biến đổi Gabor , dường như là biến đổi Fourier thời gian ngắn phổ biến nhất (STFT).
Như bạn đã chỉ ra, và như bài viết trên Wikipedia chỉ ra, tất cả các kỹ thuật biến đổi Fourier trong thời gian ngắn đều có sự đánh đổi:
- khi bạn cắt chuỗi thời gian thành các đoạn rất ngắn, bạn sẽ có được thông tin thời gian chính xác cao như chính xác khi âm bắt đầu và dừng, nhưng thông tin tần số rất mờ.
- Khi bạn cắt chuỗi thời gian thành các đoạn rất dài, bạn sẽ có được thông tin tần số chính xác cao về tần số chính xác của âm, nhưng thời gian chính xác nó bắt đầu và dừng lại bị mờ.
Đây là một vấn đề nổi tiếng, nhưng than ôi, không chỉ chưa được giải quyết, nó đã được chứng minh rằng sự không chắc chắn giữa hai điều này là không thể tránh khỏi - giới hạn Gabor, giới hạn Gabis của Heisenberg, nguyên tắc không chắc chắn , v.v.
Nếu tôi là bạn, tôi sẽ bắt đầu với một trong nhiều thư viện sẵn có để tính toán biến đổi Gabor và thử nghiệm cắt chuỗi thời gian thành nhiều độ dài khác nhau. Có một cơ hội khá tốt, bạn sẽ gặp may mắn và cuối cùng bạn sẽ có một khoảng thời gian phù hợp với việc bản địa hóa thời gian thích hợp và phân biệt tần số đầy đủ .
Nếu điều đó không hiệu quả với ứng dụng này, thì tôi sẽ chuyển sang các cách tiếp cận khác để biểu diễn tần số thời gian và phân tích tần số thời gian - biến đổi wavelet, biến đổi chirplet , biến đổi Fourier phân đoạn (FRFT), v.v.
EDIT: Một số mã nguồn để tạo sơ đồ phổ / biểu đồ thác nước từ dữ liệu âm thanh:
Image to Spectrogram đi theo hướng ngược lại với các tiện ích trên.