2008-09-17 31 views
10

Tôi cần phải tìm tần số của mẫu, được lưu trữ (trong vb) dưới dạng một mảng byte. Mẫu là sóng sin, tần số đã biết, vì vậy tôi có thể kiểm tra), nhưng các con số hơi lạ và toán học của tôi yếu. Phạm vi đầy đủ các giá trị 0-255. 99% số nằm trong khoảng từ 235 đến 245, nhưng có một số ngoại lệ xuống 0 và 1 và lên tới 255 trong 1% còn lại. Làm cách nào để bình thường hóa điều này để loại bỏ các ngoại lệ, (tính khoảng thời gian 235-245 vì nó có thể thay đổi với các mẫu khác nhau), và làm thế nào để tính toán số không giao cắt để nhận tần số? Xin lỗi nếu mô tả này là rác!Phân tích toán học của một mẫu âm thanh (như một mảng số)

+0

không phải rác. tốt câu hỏi thực sự. – Purfideas

+0

Bạn có thể muốn thay đổi tiêu đề thành "một mảng số" –

Trả lời

6

Các FFT có lẽ là câu trả lời tốt nhất, nhưng nếu bạn thực sự muốn làm điều đó bằng phương pháp của bạn, hãy thử này:

Để bình thường, trước tiên hãy một biểu đồ để đếm có bao nhiêu occurrances của mỗi giá trị từ 0 đến 255 . Sau đó ném ra X phần trăm các giá trị từ mỗi đầu với cái gì đó như:

for (i=lower=0;i< N*(X/100); lower++) 
    i+=count[lower]; 
//repeat in other direction for upper 

Bây giờ bình thường hóa với

A[i] = 255*(A[i]-lower)/(upper-lower)-128 

vứt bỏ kết quả bên ngoài phạm vi -128..127.

Bây giờ bạn có thể đếm số lần giao cắt bằng không. Để chắc chắn rằng bạn không bị lừa bởi tiếng ồn, bạn có thể muốn theo dõi độ dốc trên một vài điểm cuối cùng, và chỉ đếm số lần vượt qua khi độ dốc trung bình đang đi đúng hướng.

3

Sử dụng biến đổi Fourier, nó nhiều hơn tiếng ồn không nhạy cảm hơn đếm zero cửa

Edit: @WaveyDavey

Tôi tìm thấy một F # thư viện để làm một FFT: From here

Khi nó quay ra, triển khai miễn phí tốt nhất mà tôi đã tìm thấy cho người dùng F # cho đến nay vẫn là thư viện FFTW tuyệt vời . Trang web của họ có biên dịch sẵn Windows DLL. Tôi đã viết các ràng buộc tối thiểu cho phép truy cập an toàn chủ đề tới F2W vào FFTW từ F #, với cả giao diện người dùng và giao diện đơn giản. Hiệu suất tuyệt vời, 32-bit Windows XP Pro chỉ lên tới 35% chậm hơn 64 bit so với Linux.

Bây giờ tôi chắc chắn rằng bạn có thể gọi F # lib từ VB.net, C# vv, mà phải ở trong tài liệu của họ

+0

Bất kỳ con trỏ nào cho noob để thực hiện DFT/FFT trong VB từ mảng byte? –

+0

Nếu tài liệu không rõ ràng, tôi chỉ cần đặt câu hỏi được gắn thẻ .net, "cách gọi F # lib từ VB?" – Purfideas

5

Các phương pháp tiêu chuẩn để tấn công vấn đề này là phải xem xét một khối dữ liệu, hy vọng ít nhất hai lần tần số thực tế (lấy thêm dữ liệu không phải là xấu, vì vậy nó tốt để đánh giá quá cao một chút), sau đó lấy FFT và đoán rằng tần số tương ứng với số lớn nhất trong phổ FFT kết quả.

Nhân tiện, các vấn đề tương tự đã được hỏi ở đây trước đây - bạn cũng có thể tìm kiếm các câu trả lời đó.

0

Tôi googled cho "fft cơ bản". Visual Basic FFT Câu hỏi của bạn hét lên FFT, nhưng hãy cẩn thận, bằng cách sử dụng FFT mà không hiểu một chút về DSP có thể dẫn đến kết quả mà bạn không hiểu hoặc không biết chúng đến từ đâu.

1

Nếu tôi hiểu rõ từ mô tả của bạn, những gì bạn có là tín hiệu kết hợp giữa sin và hằng số cộng với một số trục trặc ngẫu nhiên. Nói, giống như

x[n] = A*sin(f*n + phi) + B + N[n] 

trong đó N [n] là nhiễu "trục trặc" bạn muốn loại bỏ.

Nếu trục trặc dài một mẫu, bạn có thể loại bỏ chúng bằng bộ lọc trung bình phải lớn hơn chiều dài trục trặc. Trên cả hai mặt của trục trặc. Độ ổn định của chiều dài 1, có nghĩa là bạn sẽ có đủ với một trung bình của 3 mẫu chiều dài.

y[n] = median3(x[n]) 

Các trung bình được tính toán như vậy: Lấy mẫu x bạn muốn lọc (x [n-1], x [n], x [n + 1]), sắp xếp chúng, và đầu ra của bạn là cái ở giữa.

Hiện tại, tín hiệu nhiễu sẽ biến mất, loại bỏ tín hiệu không đổi. Tôi hiểu bộ đệm có độ dài giới hạn và đã biết, vì vậy bạn có thể tính toán trung bình của toàn bộ bộ đệm. Trừ nó đi.

Bây giờ bạn có tín hiệu xoang đơn. Bây giờ bạn có thể tính toán tần số cơ bản bằng cách đếm số lần giao cắt không. Đếm số lượng mẫu trên 0 trong đó mẫu cũ dưới 0. Thời gian là tổng số mẫu của bộ đệm của bạn chia cho điều này, và tần số là oposite (1/x) của giai đoạn.

1

Mặc dù tôi sẽ đi với đa số và nói rằng nó có vẻ như những gì bạn muốn là một giải pháp fft (thuật toán fft là khá nhanh), nếu fft không phải là câu trả lời cho bất cứ lý do bạn có thể muốn thử lắp một đường cong sin cho dữ liệu bằng cách sử dụng chương trình phù hợp và đọc tần số được trang bị.

Sử dụng Fityk, bạn có thể tải dữ liệu và phù hợp với a*sin(b*x-c) trong đó 2*pi/b sẽ cung cấp cho bạn tần suất sau khi lắp.

Fityk có thể được sử dụng từ một gui, từ dòng lệnh để tạo tập lệnh và có API C++ để có thể được đưa vào chương trình của bạn trực tiếp.

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