Cách lấy mẫu lại âm thanh bằng FFT hoặc DFT


12

Tôi đang lấy mẫu âm thanh giọng nói bằng cách trước tiên thực hiện FFT, sau đó chỉ lấy các phần của kết quả mà tôi cần, sau đó thực hiện FFT ngược. Tuy nhiên, nó chỉ hoạt động chính xác khi tôi sử dụng tần số có cả hai công suất, giả sử lấy mẫu từ 32768 đến 8192. Tôi thực hiện FFT trên dữ liệu 32k, loại bỏ 3/4 dữ liệu trên cùng và sau đó thực hiện nghịch đảo FFT trên 1/4 còn lại.

Tuy nhiên, bất cứ khi nào tôi cố gắng thực hiện điều này với dữ liệu không đúng một trong hai điều xảy ra: Thư viện toán học tôi (Aforge.Math) sử dụng ném phù hợp, bởi vì các mẫu của tôi không phải là sức mạnh của hai. Nếu tôi cố gắng không đệm các mẫu để chúng trở thành sức mạnh của twos, thì nó sẽ trở nên vô nghĩa ở đầu bên kia. Tôi cũng đã cố gắng sử dụng DFT thay thế, nhưng cuối cùng nó rất chậm (điều này cần phải được thực hiện trong thời gian thực).

Làm thế nào để tôi chuyển sang không đệm dữ liệu FFT đúng cách, cả trên FFT ban đầu và FFT nghịch đảo ở cuối? Giả sử tôi có một mẫu ở mức 44,1khz cần đến 16khz, tôi hiện đang thử một cái gì đó như thế này, mẫu có kích thước 1000.

  1. Dữ liệu đầu vào pad đến 1024 ở cuối
  2. Thực hiện FFT
  3. Đọc 512 mục đầu tiên thành một mảng (tôi chỉ cần 362 đầu tiên, nhưng cần ^ 2)
  4. Thực hiện nghịch đảo FFT
  5. Đọc 362 mục đầu tiên vào bộ đệm phát âm thanh

Từ đây, tôi nhận được rác ở cuối. Làm điều tương tự nhưng không phải đệm ở bước 1 và 3 do các mẫu đã được ^ 2, cho kết quả chính xác.

c#  audio 

9
FFT thực sự không phải là cách đúng đắn để làm điều này. Bạn muốn có một bộ lọc polyphase để đạt hiệu quả tối đa, nhưng nếu bạn chỉ muốn giải quyết vấn đề, trước tiên hãy lấy mẫu lên GCD, sau đó bỏ qua, sau đó lấy mẫu xuống.
Bjorn Roche

Xin chào Bjorn: "GCD" là gì?
SpeedCoder5

Câu trả lời:


16

Bước đầu tiên là xác minh rằng cả tỷ lệ mẫu bắt đầu và tỷ lệ mẫu mục tiêu của bạn đều là số hữu tỷ . Vì chúng là số nguyên nên chúng là số hữu tỉ. Nếu một trong số chúng không phải là một con số hợp lý thì vẫn có thể làm cho tốc độ mẫu thay đổi, nhưng đó là một quá trình khác biệt và khó khăn hơn nhiều.

2232527227533272255

Các bước trước phải được thực hiện cho dù bạn muốn lấy mẫu lại dữ liệu như thế nào. Bây giờ hãy nói về cách làm điều đó với FFT. Mẹo để lấy mẫu lại với FFT là chọn độ dài FFT giúp mọi thứ hoạt động tốt. Điều đó có nghĩa là chọn độ dài FFT là bội số của tỷ lệ số thập phân (441, trong trường hợp này). Vì lợi ích của ví dụ, chúng ta hãy chọn độ dài FFT là 441, mặc dù chúng ta có thể đã chọn 882 hoặc 1323 hoặc bất kỳ bội số dương nào khác của 441.

Để hiểu làm thế nào điều này hoạt động nó giúp hình dung nó. Bạn bắt đầu với một tín hiệu âm thanh trông, trong miền tần số, giống như hình dưới đây. Tốc độ mẫu 44,1 kHz

Khi bạn đã xử lý xong, bạn muốn giảm tốc độ mẫu xuống 16 kHz, nhưng bạn muốn càng ít biến dạng càng tốt. Nói cách khác, bạn chỉ muốn giữ mọi thứ từ hình trên từ -8 kHz đến +8 kHz và bỏ mọi thứ khác. Đó là kết quả trong hình dưới đây. nhập mô tả hình ảnh ở đây

Xin lưu ý rằng tỷ lệ mẫu không theo tỷ lệ, chúng chỉ ở đó để minh họa các khái niệm.

255

Như bạn có thể nghi ngờ, có một vài vấn đề tiềm ẩn. Tôi sẽ đi qua từng người và giải thích làm thế nào bạn có thể vượt qua chúng.

  1. Bạn sẽ làm gì nếu dữ liệu của bạn không phải là một hệ số thập phân đẹp? Bạn có thể dễ dàng khắc phục điều này bằng cách đệm phần cuối dữ liệu của bạn với các số không đủ để làm cho nó trở thành bội số của hệ số thập phân. Dữ liệu được đệm TRƯỚC KHI nó được FFT'ed.

  2. ll1số không (xin lưu ý rằng số lượng mẫu dữ liệu và số lượng mẫu đệm phải BÓNG là bội số dương của hệ số thập phân - bạn có thể tăng chiều dài đệm để đáp ứng ràng buộc này), FFT'ing dữ liệu đệm, nhân miền tần số dữ liệu và bộ lọc, sau đó đặt bí danh cho kết quả tần số cao (> 8 kHz) xuống kết quả tần số thấp (<8 kHz) trước khi giảm kết quả tần số cao. Thật không may, vì lọc trong miền tần số là một chủ đề lớn theo cách riêng của mình, tôi sẽ không thể đi sâu vào chi tiết hơn trong câu trả lời này. Tuy nhiên, tôi sẽ nói rằng nếu bạn lọc và đang xử lý dữ liệu trong nhiều phần, bạn sẽ cần thực hiện Overlap-and-Add hoặc Overlap-and-Save để lọc liên tục.

Tôi hi vọng cái này giúp được.

EDIT: Sự khác biệt giữa số lượng mẫu miền tần số bắt đầu và số lượng mẫu miền tần số mục tiêu cần phải đồng đều để bạn có thể loại bỏ cùng số lượng mẫu khỏi mặt tích cực của kết quả làm mặt âm của kết quả. Trong trường hợp ví dụ của chúng tôi, số lượng mẫu bắt đầu là tốc độ giảm dần, hoặc 441, và số lượng mẫu mục tiêu là tốc độ nội suy, hoặc 160. Sự khác biệt là 279, không phải là số chẵn. Giải pháp là tăng gấp đôi chiều dài FFT lên 882, điều này khiến số lượng mẫu mục tiêu cũng tăng gấp đôi lên 320. Bây giờ sự khác biệt là chẵn và bạn có thể bỏ các mẫu miền tần số thích hợp mà không gặp vấn đề gì.


Rất đẹp. Làm thế nào bạn làm cho con số tốt đẹp như vậy trên bay, Jim?
Spacey

@Mohammad Tôi thường sử dụng Powerpoint. Trong trường hợp này, tôi đã sử dụng phiên bản Powerpoint của Libre Office, mà tôi tin là được gọi là "Ấn tượng".
Jim Clay

Xin chào, tôi có một câu hỏi về quan điểm của bạn (2). Ý bạn là gì chính xác trong bước này: "... và sau đó đặt bí danh cho kết quả tần số cao (> 8 kHz) xuống kết quả tần số thấp (<8 kHz) trước khi giảm kết quả tần số cao." Tôi hiểu các bước trước đó. Sau khi tôi nhân dữ liệu miền f của mình với miền f của bộ lọc, thì sao? Ngoài ra, phương pháp này có hoạt động nếu bạn muốn lấy mẫu dữ liệu của mình không? Cảm ơn bạn.
TheGrapeBeyond

@TheGrapeBeyond Khi bạn bí danh trong miền thời gian, bạn thêm tất cả các vùng Nyquist lại với nhau. Các yếu tố đầu tiên của tất cả các vùng Nyquist được thêm vào với nhau và trở thành yếu tố đầu tiên mới của vùng Nyquist đầu tiên. Yếu tố thứ hai của tất cả các khu Nyquist được thêm vào với nhau và trở thành yếu tố thứ hai mới của vùng Nyquist đầu tiên, vv
Jim Clay

Hmm, tôi không chắc là tôi hiểu cách bạn thực hiện việc lấy mẫu dựa trên FFT, bởi vì khi tôi thử nó ở đây tôi nhận được kết quả rất lạ. Tôi sẽ làm một câu hỏi về nó.
TheGrapeBeyond

3

Trong khi câu trả lời trên thực sự đầy đủ:

Đây là ý chính của nó:

  1. để giảm tín hiệu, nó cần phải là một số nguyên. Trước khi lấy mẫu tín hiệu xuống, bạn cần LỌC tín hiệu.
  2. bạn có thể đạt được số lần xuống số hợp lý bằng cách lấy mẫu lên / nội suy tín hiệu trước.
  3. Upsampling chỉ đơn giản là chèn các số không và sau đó LỌC tín hiệu.
  4. để đạt được tỷ lệ mẫu 3/4. lấy mẫu tín hiệu bằng cách chèn 4 số 0 giữa mỗi mẫu tín hiệu. Áp dụng bộ lọc. Sau đó LỌC tín hiệu và xóa cứ 3 trong số 4 mẫu tín hiệu.

Chi tiết về điều này:

http://www.ws.binghamton.edu/fowler/fowler%20personal%20page/EE523_files/Ch_14_1%20Subband%20Intro%20&%20Multirate%20(PPT).pdf

Ngoài ra: trừ khi thật sự cần thiết KHÔNG NÊN máy tính FFT để tính IFFT. Đây là một quá trình cực kỳ chậm và được coi là không phù hợp cho hầu hết các tác vụ xử lý tín hiệu. FFT thường được sử dụng để phân tích vấn đề hoặc chỉ áp dụng xử lý tín hiệu trong miền tần số.


1

Như Bjorn Roche đã nói, sử dụng FFT cho việc này sẽ vô cùng tồi tệ. Nhưng ở đây, nó đi theo một cách rất đơn giản bằng cách sử dụng phương pháp upample filter và downsample trong miền tần số.

1 - Lấy tín hiệu vectơ mong muốn có độ dài N.

2 - Thực hiện N điểm FFT.

3 - Không đệm FFT với các số không 160 * N ở giữa vectơ FFT.

4 - Thực hiện IFFT

5 - Chọn một trong số 441 mẫu loại bỏ 440 mẫu còn lại.

Bạn sẽ được để lại một vectơ có độ dài N * 160/441, đó sẽ là tín hiệu được lấy lại của bạn.

Như bạn có thể thấy bạn đang làm rất nhiều tính toán vô nghĩa, bởi vì hầu hết các kết quả sẽ bị ném đi. Nhưng nếu bạn có quyền truy cập vào mã thực hiện FFT, bạn thực sự có thể điều chỉnh nó một chút để nó chỉ tính toán kết quả IFFT mà bạn sẽ kết thúc chứ không phải những gì bạn sẽ vứt bỏ.

Hy vọng nó giúp.

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.