2008-10-26 32 views
13

Tôi có luồng âm thanh 44Khz từ đĩa CD, được biểu diễn dưới dạng một mảng mẫu PCM 16 bit. Tôi muốn cắt nó xuống một dòng 11KHz. Làm thế nào để làm điều đó? Từ những ngày của tôi về lớp kỹ thuật nhiều năm trước, tôi biết rằng luồng sẽ không thể mô tả bất cứ điều gì chính xác hơn 5500Hz, vì vậy tôi cho rằng tôi muốn cắt mọi thứ ở trên. Bất kỳ ý tưởng? Cảm ơn.Lấy mẫu xuống và áp dụng bộ lọc lowpass cho âm thanh kỹ thuật số

Cập nhật: Có một số mã trên this page chuyển đổi từ 48KHz sang 8KHz bằng thuật toán đơn giản và mảng hệ số trông giống như {1, 4, 12, 12, 4, 1}. Tôi nghĩ đó là những gì tôi cần, nhưng tôi cần nó với hệ số 4x thay vì 6x. Bất kỳ ý tưởng làm thế nào những hằng số được tính toán? Ngoài ra, tôi cuối cùng chuyển đổi các mẫu 16 byte để nổi anyway, vì vậy tôi có thể làm downsampling với phao chứ không phải là quần short, nếu điều đó giúp chất lượng ở tất cả.

+0

Mã này là trung bình có trọng số trên cửa sổ. Nó có thể được tính toán từ một DFT nghịch đảo của một hàm lọc trên miền tần số. Bạn có thể sử dụng một mảng phần tử 4 và thử nghiệm với các giá trị, một cái gì đó như [0.1, 0.4, 0.4, 0.1], cho đến khi nó có vẻ tốt. – artificialidiot

Trả lời

9

Đọc trên bộ lọc FIR và IIR. Đây là những bộ lọc sử dụng một mảng coefficent.

Nếu bạn thực hiện tìm kiếm trên google "FIR hoặc IIR filter designer", bạn sẽ tìm thấy nhiều phần mềm và ứng dụng trực tuyến thực hiện công việc khó khăn (nhận các hệ số) cho bạn.

EDIT:

Trang này đây (http://www-users.cs.york.ac.uk/~fisher/mkfilter/) cho phép bạn nhập các thông số của bộ lọc của bạn và sẽ nhổ ra sẵn sàng sử dụng C-Code ...

+0

Bạn có thể giải thích ngắn gọn hoặc liên kết với "công việc khó khăn" không? – jarryd

1

Bạn cần áp dụng bộ lọc lowpass trước khi bạn giảm mẫu tín hiệu để tránh "bí danh". Tần số cắt của bộ lọc lowpass phải nhỏ hơn tần số nyquist, là một nửa tần số mẫu.

+0

nó sẽ không vẫn giới thiệu tiếng ồn sau khi downsampling? – artificialidiot

+0

Vì tín hiệu bị downsampled với một yếu tố không thể thiếu (44 đến 11 khz là 1: 4) nó sẽ không quá tệ. Hoàn hảo resampling là một nghệ thuật. – Hallgrim

0

Tôi sẽ thử áp dụng DFT, cắt 3/4 kết quả và áp dụng DFT nghịch đảo. Tôi không thể nói nếu nó sẽ âm thanh tốt mà không thực sự cố gắng khó khăn.

+0

DFT hoạt động trong bộ đệm. Điều này giới thiệu tất cả các loại vấn đề phụ. Bạn cần phải làm cửa sổ để loại bỏ các vấn đề ở các cạnh đệm và trộn các bộ đệm trở lại bộ chuyển đổi với chồng chéo bằng cách sử dụng các phương thức chồng chéo - lưu hoặc chồng lên nhau. Bộ lọc FIR hoặc IIR tốt hơn. – Mendelt

+1

Nếu bạn có thể xử lý mọi thứ cùng một lúc, không đệm sẽ loại bỏ tất cả các vấn đề cạnh. – wnoise

+0

Nếu bạn xử lý mọi thứ cùng một lúc, DFT có thể mất nhiều thời gian. Một DFT mất O (n^2). Bạn có thể sử dụng một FFT nhưng chỉ hoạt động nếu kích thước bộ đệm là một sức mạnh của hai. Thông thường bạn đạt được điều đó bằng cách cắt tín hiệu trong bộ đệm nhỏ hơn. – Mendelt

5

Bạn nói đúng ở chỗ bạn cần áp dụng lọc lowpass trên tín hiệu của bạn. Bất kỳ tín hiệu nào trên 5500 Hz sẽ xuất hiện trong tín hiệu được lấy mẫu của bạn nhưng 'bí danh' là một tần suất khác, do đó bạn sẽ phải loại bỏ tín hiệu đó trước khi lấy mẫu xuống.

Bạn nên thực hiện việc lọc với phao nổi. Có các thuật toán lọc điểm cố định, nhưng những thuật toán này thường có sự cân bằng chất lượng để hoạt động. Nếu bạn đã có nổi sau đó sử dụng chúng!

Sử dụng DFT để lọc thường quá mức và nó làm cho mọi thứ trở nên phức tạp hơn vì dft không phải là quá trình liên tục nhưng hoạt động trên bộ đệm.

Bộ lọc kỹ thuật số thường có hai sở thích. FIR và IIR. The're thường là ý tưởng tương tự nhưng bộ lọc IIF sử dụng các vòng phản hồi để đạt được một phản ứng dốc hơn với các hệ số ít hơn nhiều. Điều này có thể là một ý tưởng tốt cho downsampling bởi vì bạn cần một độ dốc lọc rất dốc ở đó.

Lấy mẫu xuống là một trường hợp đặc biệt. Bởi vì bạn sẽ vứt bỏ 3 trong số 4 mẫu, không cần tính chúng. Có một lớp bộ lọc đặc biệt cho bộ lọc gọi là polyphase này.

Hãy thử googling cho polyphase IIR hoặc FIR đa cấp để biết thêm thông tin.

0

Giải pháp "tốt nhất" có thể thực sự là DFT, loại bỏ 3/4 tần số hàng đầu và thực hiện DFT nghịch đảo, với miền bị hạn chế ở dưới cùng 1/4. Loại bỏ 3/4 hàng đầu là bộ lọc low-pass trong trường hợp này. Đệm vào một sức mạnh của 2 số mẫu có thể sẽ cung cấp cho bạn một lợi ích tốc độ. Hãy nhận biết cách gói FFT của bạn lưu trữ các mẫu mặc dù.Nếu đó là một FFT phức tạp (dễ phân tích hơn nhiều và thường có các thuộc tính đẹp hơn), các tần số sẽ chuyển từ -22 đến 22 hoặc 0 đến 44. Trong trường hợp đầu tiên, bạn muốn giữa 1/4. Trong thứ hai, ngoài cùng 1/4.

Bạn có thể thực hiện một công việc phù hợp bằng cách lấy trung bình các giá trị mẫu. Cách ngây thơ lấy mẫu bốn và làm một tác phẩm bình quân có trọng số bằng nhau, nhưng không quá lớn. Thay vào đó, bạn sẽ muốn sử dụng một hàm "hạt nhân" để tính trung bình chúng theo cách không trực quan.

Theo cách toán học, loại bỏ mọi thứ bên ngoài dải tần số thấp là nhân với chức năng hộp trong không gian tần số. Biến đổi Fourier (nghịch đảo) biến phép nhân theo điểm thành một phép biến đổi các biến đổi Fourier (nghịch đảo) của các hàm, và ngược lại. Vì vậy, nếu chúng ta muốn làm việc trong miền thời gian, chúng ta cần thực hiện một phép hồi quy với hàm biến đổi Fourier (nghịch đảo) của hàm hộp. Điều này hóa ra là tỷ lệ với hàm "sinc" (sin at)/at, trong đó a là chiều rộng của hộp trong không gian tần số. Vì vậy, tại mọi vị trí thứ 4 (kể từ khi bạn đang downsampling bởi một yếu tố của 4) bạn có thể thêm lên các điểm gần đó, nhân với tội lỗi (một dt)/a dt, nơi dt là khoảng cách trong thời gian đến vị trí đó. Làm thế nào gần đó? Vâng, điều đó phụ thuộc vào việc bạn muốn nó phát ra như thế nào. Thông thường, hãy bỏ qua mọi thứ bên ngoài số 0 đầu tiên, hoặc chỉ lấy số điểm là tỷ lệ mà bạn đang lấy mẫu.

Cuối cùng, có một cách cực kỳ nghèo nàn (nhưng nhanh) để loại bỏ phần lớn các mẫu, chỉ giữ lại số không, thứ tư, v.v.

Thành thật mà nói, nếu nó phù hợp với bộ nhớ, tôi khuyên bạn chỉ nên đi tuyến đường DFT. Nếu nó không sử dụng một trong các gói phần mềm bộ lọc mà người khác đã đề nghị xây dựng bộ lọc cho bạn.

+0

Việc giảm hệ số DFT giống như nhân với một cửa sổ trong miền tần số. Nó không được khuyến khích khi làm việc với các tín hiệu có độ dài hữu hạn. – Royi

+1

@ Drazick: Nó không phải là "giống như", đúng vậy. Được đề xuất bởi ai vì mục đích gì, với lý do gì? Nếu bạn không loại bỏ mọi thứ với tần suất cao hơn, nó sẽ hiển thị bí danh ở tần số thấp hơn. Có thể một số cửa sổ không phải hình chữ nhật cũng bằng 0 và trên tần số này cho âm thanh "mượt mà" hơn, nhưng sau đó nó biểu thị tín hiệu ban đầu kém hơn. – wnoise

0

Gần đây tôi đã xem qua số BruteFIR có thể đã làm một số điều bạn quan tâm?

3

Thông báo (ngoài các nhận xét khác) rằng cách tiếp cận đơn giản-trực quan "downsample theo hệ số 4 bằng cách thay thế mỗi nhóm 4 mẫu liên tiếp theo giá trị trung bình", không tối ưu không sai, cũng không thực tế hay khái niệm. Bởi vì số lượng trung bình chính xác đến một bộ lọc thông thấp (một cửa sổ hình chữ nhật, tương ứng với một tần số chân thành). Điều gì sẽ là sai lầm về khái niệm là chỉ downsample bằng cách lấy một trong mỗi 4 mẫu: mà chắc chắn sẽ giới thiệu răng cưa.

Nhân tiện: thực tế mọi phần mềm thực hiện việc lấy lại mẫu (âm thanh, hình ảnh hoặc bất kỳ thứ gì; ví dụ cho trường hợp âm thanh: sox) sẽ đưa vào tài khoản và thường xuyên cho phép bạn chọn bộ lọc thông thấp bên dưới.

1

Quá trình bạn đang theo sau được gọi là "Decimation". Có 2 bước:

  1. Áp dụng bộ lọc Low Pass trên dữ liệu (Trong trường hợp LPF của bạn với Cut Off ở Pi/4).
  2. Downsampling (Trong trường hợp bạn lấy 1 trong số 4 mẫu).

Có nhiều phương pháp để thiết kế và áp dụng Bộ lọc thông thấp.

Bạn có thể bắt đầu ở đây:

http://en.wikipedia.org/wiki/Filter_design

1

Bạn có thể tận dụng libsamplerate để làm việc nặng nhọc. Libsamplerate là một API C, và chăm sóc tính toán các hệ số lọc.Bạn chọn từ các bộ lọc chất lượng khác nhau để bạn có thể giao dịch chất lượng cho tốc độ.

Nếu bạn không muốn viết bất kỳ mã nào, bạn chỉ có thể sử dụng Audacity để thực hiện chuyển đổi tỷ lệ mẫu. Nó cung cấp một giao diện đồ họa mạnh mẽ và sử dụng libsamplerate để chuyển đổi tỷ lệ mẫu của nó.

0

Bạn phải áp dụng bộ lọc low-pass (loại bỏ tần số trên 5500 Hz) và sau đó áp dụng decimation (để lại mọi mẫu thứ N, mỗi thứ 4 trong trường hợp của bạn).

Đối với decimation, FIR, không phải bộ lọc IIR thường được sử dụng, bởi vì chúng không phụ thuộc vào đầu ra trước đó và do đó bạn không phải tính toán bất cứ điều gì cho mẫu bị loại bỏ. IIRs, nói chung, phụ thuộc vào cả đầu vào và đầu ra, vì vậy, trừ khi một loại IIR cụ thể được sử dụng, bạn phải tính toán mọi mẫu đầu ra trước khi loại bỏ 3/4 của chúng.

Chỉ cần googled bài viết giới thiệu về chủ đề: http://www.dspguru.com/dsp/faqs/multirate/decimation

Các vấn đề liên quan