2015-07-27 16 views
6

Nhìn vào câu trả lời này: Python Scipy FFT wav filesTại sao tôi nên loại bỏ một nửa số tiền FFT trả về?

Phần kỹ thuật rõ ràng và làm việc, nhưng tôi có hai câu hỏi lý thuyết (mã đề cập ở dưới):

1) Tại sao tôi phải chuẩn hóa (b=...) khung? Điều gì sẽ xảy ra nếu tôi sử dụng dữ liệu thô?

2) Tại sao tôi chỉ nên sử dụng một nửa kết quả FFT (d=...)?

3) Tại sao tôi nên abs(c) kết quả FFT?

Có lẽ tôi thiếu điều gì đó do hiểu biết không đủ về định dạng WAV hoặc FFT, nhưng trong khi mã này hoạt động tốt, tôi rất vui khi hiểu tại sao nó hoạt động và cách sử dụng tốt nhất.

Edit: để đáp ứng với những nhận xét của @Trilarion:

Tôi đang cố gắng để viết một đơn giản, không chính xác 100% nhưng nhiều hơn như một bằng chứng của khái niệm Speaker Diarisation bằng Python. Điều đó có nghĩa là lấy một tập tin wav (ngay bây giờ tôi đang sử dụng this one cho các bài kiểm tra của tôi) và trong mỗi giây (hoặc bất kỳ độ phân giải nào khác) nói nếu người nói là người # 1 hoặc người # 2. Tôi biết trước rằng đây là 2 người và tôi không cố gắng liên kết họ với bất kỳ chữ ký tiếng nói nào, chỉ để tách biệt. Ngay bây giờ mất mỗi giây, FFT nó (và do đó có được một danh sách các tần số), và cluster chúng bằng cách sử dụng KMeans với số cụm giữa 2 và 4 (A, B [, Silence [, A + B]]).

Tôi vẫn còn mới để phân tích tệp wav và âm thanh nói chung.

import matplotlib.pyplot as plt 
from scipy.io import wavfile # get the api 
fs, data = wavfile.read('test.wav') # load the data 
a = data.T[0] # this is a two channel soundtrack, I get the first track 
b=[(ele/2**8.)*2-1 for ele in a] # this is 8-bit track, b is now normalized on [-1,1) 
c = sfft.fft(b) # create a list of complex number 
d = len(c)/2 # you only need half of the fft list 
plt.plot(abs(c[:(d-1)]),'r') 
plt.show() 
+1

Để bắt đầu, bạn có thể đọc [this] (http://mathworks.com/help/matlab/math/fast-fourier-transform-fft.html). – mkrieger1

+1

Đối với (2): Có vẻ như các câu trả lời gốc của các cụm từ tần số âm và chỉ sử dụng các thuật ngữ tần số dương. Đối với tín hiệu âm thanh, những tín hiệu này cần được dự phòng. – dhke

+1

Hãy làm một câu hỏi thực sự của nó. Tại sao bạn nên làm điều gì đó rõ ràng phụ thuộc vào những gì bạn muốn đạt được. Vì câu hỏi này không rõ ràng và do đó không hữu ích ngoại trừ bạn. Các câu trả lời là rất rộng rãi trong việc giải thích kiến ​​thức đằng sau biến đổi fourier nhưng họ không bao giờ có thể trả lời lý do tại sao bạn nên làm điều đó. – Trilarion

Trả lời

6

Để giải quyết những theo thứ tự:

1) Bạn không cần phải bình thường, nhưng bình thường hóa đầu vào là gần với cấu trúc thô của dạng sóng được số hóa nên con số này unintuitive. Ví dụ: giá trị lớn như thế nào là 67? Sẽ dễ dàng hơn để bình thường hóa nó trong phạm vi từ -1 đến 1 để diễn giải các giá trị. (Nhưng nếu bạn muốn thực hiện một bộ lọc, ví dụ, nơi bạn đã thực hiện một FFT, sửa đổi các giá trị FFT, theo sau là một IFFT, bình thường hóa sẽ là một rắc rối không cần thiết.)

2) và 3) tương tự như vậy cả hai đều phải làm với toán học sống chủ yếu trong không gian số phức. Tức là, FFT có dạng sóng của các số phức (ví dụ: [.5 + .1j, .4 + .7j, .4 + .6j, ...]) đến một chuỗi số phức khác.

Vì vậy, một cách chi tiết:

2) Nó chỉ ra rằng nếu dạng sóng đầu vào là có thật thay vì phức tạp, sau đó FFT có đối xứng về 0, vì vậy chỉ những giá trị mà có tần số> = 0 là duy nhất hấp dẫn.

3) Các giá trị đầu ra của FFT rất phức tạp, vì vậy chúng có phần Re và Im, nhưng điều này cũng có thể được biểu thị dưới dạng độ lớn và pha. Đối với tín hiệu âm thanh, nó thường là cường độ đó là thú vị nhất, bởi vì đây là chủ yếu những gì chúng ta nghe. Vì vậy mọi người thường sử dụng abs (đó là độ lớn), nhưng giai đoạn có thể là quan trọng cho các vấn đề khác nhau là tốt.

0

Điều đó tùy thuộc vào những gì bạn đang cố gắng làm. Có vẻ như bạn chỉ đang tìm kiếm để vẽ mật độ quang phổ và sau đó nó là OK để làm như vậy.

Nói chung, hệ số trong DFT phụ thuộc vào pha cho mỗi tần số vì vậy nếu bạn muốn giữ thông tin về pha, bạn phải giữ đối số của các số phức.

Đối xứng bạn thấy chỉ được đảm bảo nếu đầu vào là chuỗi số thực (IIRC). Nó liên quan đến méo phản chiếu bạn sẽ nhận được nếu bạn có tần số trên tần số Nyquist (một nửa tần số lấy mẫu), tần số ban đầu xuất hiện trong DFT, nhưng cũng có tần số được nhân đôi.

Nếu bạn định nghịch đảo DFT, bạn nên giữ nguyên toàn bộ dữ liệu và cũng giữ đối số của các hệ số DFT.

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