Lấy mẫu lại Soundfile Python

(Ghi chú. bài đăng này được viết dưới dạng Notebook Jupyter có thể tìm thấy bằng mã Python tại https. //nbviewer. jupyter. org/gist/jthiem/0bb8b2296c8dbd0b83bfab8270a8eb24. )


CẬP NHẬT. Bạn có thể lấy mẫu lại mà không cần gì ngoài scipy và một chức năng bổ sung ngay bây giờ. Xem bài viết mới này
Bây giờ tôi đã viết một gói mà bạn có thể cài đặt bằng pip

Một trong những nhiệm vụ cơ bản nhất trong xử lý âm thanh mà bất kỳ ai cũng cần thực hiện là lấy mẫu lại các tệp âm thanh; . 44. 1k? .  never sampled in the rate you want. 44.1k? 16k? 8k? Those are the common ones; there are some really odd ones out there.

Lấy mẫu lại thực sự khá khó để làm đúng. Bạn cần chọn đúng các bộ lọc khử răng cưa của mình và viết quy trình nội suy/thập phân để không gây ra quá nhiều nhiễu. Đã có sách viết về chủ đề này. Đối với hầu hết các phần, không có cách phổ biến duy nhất để đạt được quyền này, vì bối cảnh quan trọng

Để thảo luận chi tiết hơn về chuyển đổi tỷ lệ mẫu, hãy xem "Trang chủ lấy mẫu lại âm thanh kỹ thuật số" có tên thích hợp [https. //ccrma. standford. edu/~jos/mẫu lại/]. Sau đó nhìn vào [http. //src. vô hạn. ca/] để so sánh siêu thông tin về rất nhiều triển khai lấy mẫu lại.   Không nghiêm túc đâu, đến đó đi.   (Điều đó thôi thúc tôi so sánh các phương pháp bên dưới bằng cách sử dụng phép quét hình sin. )

MATLAB tích hợp sẵn   resample   hàm. Mọi người đều sử dụng nó. Nó hoạt động, nhưng cũng kém ở nhiều khía cạnh - một chức năng tốt hơn nhiều nằm trong hộp công cụ DSP, nhưng gần như tôi có thể nói, không ai sử dụng nó (ngay cả khi có rất nhiều phần khác của hộp công cụ DSP đang được sử dụng. )

Nhưng tôi không nói về MATLAB, tôi đang nói về Python ở đây và nó không có phương pháp lấy mẫu lại mặc định - trừ khi bạn đang thực hiện bất kỳ loại tính toán số nào, bạn sẽ sử dụng .  numpy and probably scipy --- and the latter has a built-in resample function.

Để vượt lên chính mình một chút,   scipy.signal.resample   . Điều đó trở nên rõ ràng khá nhanh - nó hoạt động trong miền tần số, về cơ bản bằng cách cắt ngắn hoặc không đệm tín hiệu trong miền tần số. Điều này khá xấu trong miền thời gian (đặc biệt là khi nó giả sử tín hiệu là  for audio resampling. That becomes apparent quite quickly - it works in frequency domain, by basically truncation or zero-padding the signal in the frequency domain. This is quite ugly in time domain (especially since it assumes the signal to be  tròn).

Có hai lựa chọn thay thế mà tôi muốn chỉ ra đó là "chìa khóa trao tay", nghĩa là bạn chỉ cần chỉ định tỷ lệ lấy mẫu lại của mình và thư viện sẽ thực hiện phần còn lại. Tôi biết một vài cái khác, nhưng tại thời điểm viết bài này, chúng có vẻ không dễ sử dụng (ví dụ:. chỉ thực hiện nội suy/thập phân, nhưng không tính toán bộ lọc. ) Nếu có những thư viện đáng chú ý khác mà tôi nên biết, vui lòng đề cập đến nó trong phần nhận xét về phiên bản blog của sổ ghi chép này [https. // tín hiệu đã xử lý. blogspot. de]

Phương án thứ nhất là   ______7_______. Sử dụng nó có hai vấn đề. nó dựa trên một thư viện (ngôn ngữ C) bên ngoài có tên là "Mã thỏ bí mật" (SRC như trong "chuyển đổi tỷ lệ mẫu", geddit?) hay còn gọi là libsamplerate [http. //www. siêu mọt sách. com/SRC/]. Bản thân nó không phải là vấn đề, nhưng bạn cần cài đặt nó và bước này không được tự động hóa trong pip và bạn bè (theo như tôi biết tại thời điểm viết). (Vấn đề đối với tôi là tôi cần chạy nó trên một nền tảng mà tôi không thể thực hiện việc này một cách dễ dàng. ) Vấn đề 2. scikit. lấy mẫu lại 0. 3. 3 chỉ là Python 2 và phiên bản Python 3 không chính thức (0. 4. 0-dev, tôi đã sử dụng [https. //github. com/gregorias/samplerate]).

Tên còn lại là   resampy, có thể tìm thấy trong PyPI hoặc [https. //github. com/bmcfee/resampy]. Nó rất dễ cài đặt và hoạt động với Python 3 (_______9_______   hiện sử dụng nó làm bộ lấy mẫu lại ưu tiên hơn libsamplerate)

TL;DR. nếu bạn có thể cài đặt lib bên ngoài, hãy sử dụng scikit. lấy mẫu lại (0. 4. 0-nhà phát triển).   resampy   nhanh hơn, nhưng không tốt bằng, nhưng hoàn toàn hợp lý. (Nếu MATLAB   resample   đủ tốt cho bạn,  resampy will serve you just fine and is easier to install)

Bây giờ để so sánh với hình ảnh đẹp

Downsampling một lần quét

Một nhiệm vụ phổ biến là chuyển đổi giữa tốc độ lấy mẫu CD là 44. 1 kHz và bội số của 8kHz bắt nguồn từ ngành công nghiệp telekon. Đặc biệt, 48kHz. (Được cho là tỷ lệ 44. 1k được chọn một phần    rất khó chuyển đổi thành 48 kHz . Vì vậy, hãy lấy mẫu quét ở 48 kHz. (Xem Sổ tay Jupyter để biết mã Python)

Lấy mẫu lại Soundfile Python
Quét 100-23900 Hz, được lấy mẫu ở 48 kHz

Bây giờ hãy chuyển nó thành 44. 1 kHz bằng các thư viện khác nhau và vẽ đồ thị phổ.

Lấy mẫu lại Soundfile Python
Số lần quét tương tự được lấy mẫu xuống 44. 1 kHz sử dụng scikit. lấy mẫu lại.

 
2   (hoặc  
 
3  AKA "Secret Rabbit Code") does it well. Almost no aliasing, yet close to Nyquist, and noise levels in line with the input. Note that once the sweep is above Nyquist, the output is basically nil.
Lấy mẫu lại Soundfile Python
Lấy mẫu tương tự nhưng hiện được lấy mẫu xuống bằng cách sử dụng scipy. tín hiệu. lấy mẫu lại.

Và đây là   scipy.signal.resample . Xuyên suốt toàn bộ tín hiệu có âm tần số cao và có năng lượng đáng kể ngay cả khi độ quét trên Nyquist. Đây là kết quả của quá trình xử lý miền tần số hoạt động trên toàn bộ tín hiệu tại một. Điều này KHÔNG phù hợp với tín hiệu âm thanh.

Lấy mẫu lại Soundfile Python
Lấy mẫu quét xuống tương tự bằng cách sử dụng resampy. Cuối cùng,   resampy. Có một số hiệu ứng phi tuyến vui nhộn, nhưng ở mức rất thấp - đối với các ứng dụng âm thanh nói chung không có gì đáng lo ngại. Ngay cả răng cưa cũng dưới -60 dB. Vì vậy, mặc dù không tốt bằng   scikit.resample   có thể sử dụng được và chắc chắn là tốt hơn .  scipy.signal.resample!

Upsampling một xung

Một cách để kiểm tra bộ lọc khử răng cưa là lấy mẫu xung. Ở đây, lưu ý một khía cạnh khó chịu của tất cả các thư viện khác nhau này. giao diện hoàn toàn khác nhau giữa tất cả chúng; . Điều này có nghĩa là bạn không thể chỉ chuyển đổi giữa chúng bằng cách sử dụng  resampy and scikit.resample give different length outputs for the same upsampling ratio. This means you can't just switch between them using a  ______3_______0   câu lệnh .  librosa as an example).

>>> us1 = sk_samplerate. lấy mẫu lại(xung, P/Q, 'sinc_best')
>>> us2 = scipy_signal. lấy mẫu lại(xung, int(len(xung)*P/Q))
>>> us3 = resampy. lấy mẫu lại (xung, Q, P)
>>> in(us1. hình dạng, us2. hình dạng, us3. hình dạng)
(1087,) (1088,) (1088,)
Lấy mẫu lại Soundfile Python
Đáp ứng tần số của một xung lấy mẫu từ 44. 1 kHz đến 48 kHz
 

'điên rồ. resample' chắc chắn sử dụng bộ lọc khử răng cưa tốt nhất, với độ dốc lớn, cho phép sử dụng rất ít năng lượng trên Nyquist. 'resampy' là một bộ lọc nhẹ nhàng hơn (có lẽ là bậc thấp hơn?) nhưng khá. 'scipy. tín hiệu. lấy mẫu lại'. tốt, dù sao đi nữa

Các phản ứng thúc đẩy trông như thế nào trong miền thời gian?

Lấy mẫu lại Soundfile Python
Lấy mẫu xung miền thời gian từ 44. 1 kHz đến 48 kHz
Lấy mẫu lại Soundfile Python
Cùng một phần của xung, nhưng với các mẫu được chuyển đổi thành dB (bình phương cường độ 10*log10)

Không có gì đáng ngạc nhiên, 'resampy' là nhỏ gọn nhất, điều này giải thích cho việc cắt giảm nhẹ nhàng hơn. 'điên rồ. resample' rộng hơn, nhưng có thể chấp nhận được. 'scipy. tín hiệu. lấy mẫu lại' nhô ra như ngón tay cái đau

Python Soundfile hỗ trợ những định dạng nào?

Mô-đun tệp âm thanh có thể mở tất cả các định dạng tệp mà libsndfile hỗ trợ, chẳng hạn như tệp WAV, FLAC, OGG và MAT (xem Sự cố đã biết bên dưới .

Tốc độ lấy mẫu của WAV trong Python là gì?

Soundfile trong Python là gì?

PySoundFile là mô-đun Python được sử dụng để đọc và ghi tệp âm thanh , xem tệp âm thanh dưới dạng mảng NumPy bao gồm cao độ và tất cả. Mô-đun này có thể đọc tệp âm thanh tôi. e. nó trích xuất mảng NumPy từ âm thanh (. wav) và cũng có thể viết nó.

soundfile đọc trả về cái gì?

always_2d (bool, tùy chọn) – Theo mặc định, việc đọc tệp âm thanh đơn âm sẽ trả về mảng một chiều . Với always_2d=True , dữ liệu âm thanh luôn được trả về dưới dạng mảng hai chiều, ngay cả khi tệp âm thanh chỉ có một kênh.