2011-09-29 28 views
5

tôi có một loạt các dữ liệu âm thanh tôi đi qua một đầu đọc:Làm thế nào tôi có thể nhận được dữ liệu tần số từ PCM sử dụng FFT

recorder.read(audioData,0,bufferSize); 

Các instantiation như sau:

AudioRecord recorder; 
short[] audioData; 
int bufferSize; 
int samplerate = 8000; 

//get the buffer size to use with this audio record 
bufferSize = AudioRecord.getMinBufferSize(samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT)*3; 

//instantiate the AudioRecorder 
recorder = new AudioRecord(AudioSource.MIC,samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,bufferSize); 

recording = true; //variable to use start or stop recording 
audioData = new short [bufferSize]; //short array that pcm data is put into. 

Tôi có một FFT lớp tôi đã tìm thấy trực tuyến và một lớp học phức tạp để đi với nó. Tôi đã thử hai ngày tìm kiếm trực tuyến ở mọi nơi nhưng không thể tìm ra cách lặp qua các giá trị được lưu trữ trong audioData và chuyển nó đến FFT.

Đây là lớp FFT Tôi đang sử dụng: http://www.cs.princeton.edu/introcs/97data/FFT.java và đây là lớp phức tạp để đi với nó: http://introcs.cs.princeton.edu/java/97data/Complex.java.html

Trả lời

0

PCM là kỹ thuật mã hóa dữ liệu. Nó không liên quan đến việc phân tích tần số dữ liệu âm thanh bằng FFT. Nếu bạn sử dụng Java để giải mã dữ liệu được mã hóa PCM, bạn sẽ nhận được dữ liệu âm thanh thô mà sau đó có thể được chuyển đến thư viện FFT của bạn.

+0

Tôi đã thử điều này, bằng cách sử dụng một phương pháp không qua, tôi có phải vượt qua dữ liệu tôi nhận được ra khỏi phương pháp này để FFT? –

3

Giả sử các mảng audioData chứa các dữ liệu âm thanh thô, bạn cần tạo một đối tượng từ mảng audioData như vậy:

Complex[] complexData = new Complex[audioData.length]; 
for (int i = 0; i < complexData.length; i++) { 
    complextData[i] = new Complex(audioData[i], 0); 
} 

Bây giờ bạn có thể vượt qua đối tượng complexData của bạn như một tham số để hàm số FFT của bạn:

Complex[] fftResult = FFT.fft(complexData); 
+0

Hãy thử điều này, cảm ơn! –

+0

@Ben Taliadoros: Điều này có giúp u? Bởi vì iam cũng đang đấu tranh với vấn đề này – androidGuy

+0

vâng, vấn đề của bạn là gì? # –

1

Một số chi tiết sẽ phụ thuộc vào mục đích của FFT của bạn.

Độ dài của FFT bắt buộc phụ thuộc vào độ phân giải tần số và độ chính xác thời gian (có liên quan nghịch), mà bạn muốn phân tích, có thể hoặc không ở bất kỳ đâu gần độ dài của bộ đệm đầu vào âm thanh. Với những khác biệt về chiều dài, bạn có thể phải kết hợp nhiều bộ đệm, phân đoạn một bộ đệm đơn lẻ hoặc kết hợp hai bộ đệm để có độ dài cửa sổ FFT đáp ứng các yêu cầu phân tích của bạn.

+0

từ những gì tôi đã thấy chiều dài cửa sổ chỉ lấy một số giá trị từ kết quả đầu ra của tôi? Tôi có lấy dữ liệu đỉnh ở đây để đạt được tần suất không? Cảm ơn –