Có một chương trình có thể xác định cao độ nhất trong một tệp âm thanh không?


14

Có chương trình Windows nào có thể xác định "tần số sóng âm thanh cao nhất" được tìm thấy trong một tệp âm thanh (ví dụ: tệp mp3) không?

Ví dụ: nó có thể phân tích tệp Dog-Whistle-0 và xác định rằng tần số cao nhất được tìm thấy trong tệp là khoảng ~ 12000 Hz.

Ngoài ra, nó sẽ có thể phân tích Piano.mp3 và xác định ghi chú cao nhất.

Câu trả lời:


13

R là đa nền tảng và nguồn mở / miễn phí.

Tải nó và tải tuneRseewavethư viện (cài đặt chúng từ trình quản lý gói nếu chưa được cài đặt).

library(tuneR)
library(seewave)

Sau đó, tải tệp MP3 hoặc WAV của bạn:

w = readMP3("dog-whistle-0.mp3")
w = readWave("dog-whistle-0.wav")

Bây giờ, hãy vẽ biểu đồ phổ và cực đại của nó:

fpeaks(meanspec(w), nmax=1)

Kết quả:

Kết quả số:

fpeaks(meanspec(w), nmax=1, plot=FALSE)
12.05859

Ở trên chỉ hoạt động với dữ liệu phi âm nhạc. Khi bạn phân tích tần số âm nhạc, bạn sẽ thấy rằng tần số cao nhất sẽ luôn ở khoảng 12-20 kHz, tùy thuộc vào (các) nhạc cụ có liên quan. Tuy nhiên, tần số cao nhất này sẽ không cung cấp cho bạn ước tính về nốt nhạc đang được phát, vì một nốt nhạc, khi được chơi bởi một nhạc cụ, sẽ bao gồm nhiều tần số.

Đây được gọi là "âm sắc" của một nhạc cụ và bạn sẽ thấy rằng một âm A ở 440 Hz bằng sáo sẽ bao gồm các thành phần tần số khác nhau so với A được chơi bởi guitar điện.

Đặt cược tốt nhất của bạn là chạy một phân tích tần số chi phối bằng cách nhìn vào các đỉnh tần số trên các cửa sổ thời gian trượt và kiểm tra xem nơi nào cao nhất xảy ra.

Không có thứ gọi là "tần suất theo thời gian" mặc dù. Bạn chỉ có thể vẽ tần số trung bình (hoặc chiếm ưu thế) trên các cửa sổ thời gian trượt nhất định . Seewave cung cấp khá nhiều chức năng liên quan đến việc chọn cửa sổ thời gian, nhưng nó khá phức tạp.

Bạn đã có thể sử dụng

s = specprop(meanspec(w, from=10, to=11)) 

để có được các thuộc tính phổ từ 10 đến 11 giây và sau đó gọi s$centroidhoặc s$meanđể lấy trung tâm hoặc tần số trung bình của cửa sổ thời gian cụ thể đó (mặc dù 1 giây là khá lớn để phân tích âm thanh).

Nếu tệp Wave của bạn sử dụng lấy mẫu 44,1 kHz, bạn có thể lấy mẫu xuống để giảm nỗ lực tính toán, ví dụ như xuống 16 kHz.

w = downsample(w, 16000)

Nhưng hãy nhớ rằng theo Định lý Nyquist , tần số tối đa có thể được biểu diễn bây giờ là 8 kHz.

Bạn cũng có thể tìm kiếm một phần mềm phát hiện cao độ. Giống như cái này , đòi hỏi MATLAB mặc dù.


Btw thay vì fpeaks, bạn có biết nếu có một hàm vẽ đồ thị tần số theo thời gian?
Pacerier

Xem cập nhật của tôi. Nó không tầm thường. Tôi đã không làm việc với âm thanh nhiều để biết nếu có bất cứ điều gì tốt hơn xung quanh, xin lỗi.
slhck

8

Bạn đã thử Audacity chưa? Nó là một công cụ phần mềm miễn phí có một số công cụ phân tích khá tinh vi, trong đó có một Lô Spectrum lệnh truy cập từ Phân tích -> Vẽ Spectrum ... .

Ảnh chụp màn hình

Lưu ý rằng bạn nhận được các kết quả khác nhau với phiên bản MP3 của tệp so với phiên bản WAV vì việc nén MP3 đã thay đổi dạng sóng và giới thiệu các tạo tác / răng cưa.

Chỉnh sửa: Những tệp âm thanh bạn liên kết đến không phải là ví dụ tốt cho việc này. Các tệp tần số cao hơn chỉ được lấy mẫu ở mức 44,1KHz phù hợp với khả năng nghe của con người (tối đa khoảng 20KHz). Bạn không thể biểu thị tần số siêu âm mà không tăng tốc độ mẫu.


Hmm, nó dường như không hoạt động với tệp Piano.mp3 . Đối với tôi, nó hiển thị 10121 Hz (D # 9) Screenshoot.me/uZZ2N0 , tuy nhiên điều này rất khó xảy ra vì phím lớn nhất trên đàn piano là C8 (4186Hz). Có phải tôi đang làm gì đó sai?
Pacerier

3
@Pacerier Không, nhưng bạn đã thay đổi câu hỏi của mình một chút. Mẫu còi chó rất dễ xác định vì tần số có cực đại cao nhất trong phổ cũng là tần số cao nhất và đồng thời là nốt trội. Đối với âm nhạc, tần số cao nhất không nhất thiết là nốt cao nhất, vì một nốt nhạc được chơi bởi một nhạc cụ bao gồm nhiều tần số.
slhck

@slhck Ic, tôi nghĩ rằng chúng tôi có thể đoán ghi chú nếu chúng tôi có tần số, có vẻ như nó không đơn giản lắm ..
Pacerier

@Pacerier: Nếu bạn đặt Kích thước thành giá trị cao hơn, tôi tin rằng nó có thể cho kết quả chính xác hơn và loại bỏ một số sóng hài.
James P

2
@Pacerier Không, nó thực sự không đơn giản như vậy. Phát hiện cao độ yêu cầu bạn chuyển đổi dạng sóng thành phổ tần số trước tiên (Biến đổi Fourier nhanh), sau đó áp dụng các bộ lọc (Hầu hết thông qua thấp) và một vòng các bộ lọc khác. Trừ khi bạn tìm thấy một công cụ theo dõi cao độ theo thời gian, những gì bạn đang tìm kiếm thực sự sẽ khó khăn. Bạn có thể xem xét các công cụ chỉnh sửa giọng hát như Melodyne .
slhck
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.