Làm thế nào để một bộ lọc thông thấp hoạt động theo chương trình?


9

Tôi đã làm việc trên một bộ lọc thông thấp đơn giản để đo sáng <100 Hz trong ứng dụng của mình. Nhưng cho đến nay, tôi đang vật lộn với lý thuyết đằng sau tất cả. Thật tuyệt khi tôi làm cho nó hoạt động, nhưng tôi thực sự thích nó nếu tôi biết làm thế nào / tại sao nó hoạt động.

Tôi tìm thấy đoạn mã sau:

void getLPCoefficientsButterworth2Pole(const int samplerate, const double cutoff, double* const ax, double* const by)
{
    double PI = M_PI;
    double sqrt2 = sqrt(2);

    double QcRaw  = (2 * PI * cutoff) / samplerate; // Find cutoff frequency in [0..PI]
    double QcWarp = tan(QcRaw); // Warp cutoff frequency

    double gain = 1 / ( 1 + sqrt2 / QcWarp + 2 / ( QcWarp * QcWarp ) );

    by[2] = ( 1 - sqrt2 / QcWarp + 2 / ( QcWarp * QcWarp ) ) * gain;
    by[1] = ( 2 - 2 * 2 / ( QcWarp * QcWarp ) ) * gain;
    by[0] = 1;

    ax[0] = 1 * gain;
    ax[1] = 2 * gain;
    ax[2] = 1 * gain;
}

Để tính hệ số. Sau đó, trong các mẫu âm thanh, tôi 'vượt qua' chúng theo cách này:

        xv[2] = xv[1];
        xv[1] = xv[0];

        xv[0] = pData[j];
        yv[2] = yv[1];
        yv[1] = yv[0];

        yv[0] = (ax[0] * xv[0] + ax[1] * xv[1] + ax[2] * xv[2]
                   - by[1] * yv[0]
                   - by[2] * yv[1]);

        pData[j] = yv[0];

Để có được một thiết kế đường thấp.

Tôi đang tự hỏi một vài điều:

  1. Tôi nhận được các mẫu âm thanh trong một mảng float * đơn giản. Số phao đó là gì? Điều duy nhất tôi thấy là một con số, đó là một đoạn âm thanh như thế nào?
  2. Mã đang sử dụng các tính toán trong quá khứ (ba trong số chúng) trong tính toán mới trên mỗi mẫu. Điều đó có nghĩa là 2 mẫu dữ liệu đầu tiên không được lọc chính xác? (không phải là vấn đề vì nó chỉ là 2 mẫu, nhưng chỉ cần tự hỏi)
  3. Cố gắng học mọi thứ, tôi tìm thấy một vài công thức cho bộ lọc Butterworth (Cực 2). Làm thế nào là những công thức được phản ánh trong mã này? Không có công thức nào tôi tìm thấy có những tính toán này mà bạn có thể thấy trong hàm 'getLPCoefficentsButterworth2Pole ()'.

1
Tôi không cố tỏ ra thiếu tôn trọng ở đây, nhưng câu nói của bạn "đó là một đoạn âm thanh như thế nào?" dường như chỉ ra rằng bạn không hiểu các nguyên tắc cơ bản của xử lý rời rạc thời gian. Sẽ rất khó để giải quyết bất kỳ vấn đề DSP nào mà không hiểu những điều cơ bản như định lý lấy mẫu, lượng tử hóa, hệ thống LTI, v.v. Tôi muốn giới thiệu một chút thời gian với một cuốn sách văn bản hay. Đây là dspguide.com/pdfbook.htmlm
Hilmar

Câu trả lời:


6
  1. Mảng số float * là một con trỏ tới mảng. Nó là một số duy nhất chứa địa chỉ của phần tử đầu tiên của mảng các giá trị float.

  2. Thông thường, điều kiện ban đầu (tức là các phần tử 'quá khứ' ban đầu của x và y) là 0, nhưng nếu giá trị của chúng không bằng 0 thì cũng không có vấn đề gì lớn, vì sau một thời gian, các điều kiện ban đầu không ảnh hưởng đến đầu ra tín hiệu cho bất kỳ bộ lọc ổn định. Và bộ lọc của bạn rõ ràng là ổn định.

  3. Hàm truyền thông thấp thứ hai với đặc tính Butterworth và tần số cắt ωmột= =2*π*fmột (với fmột trong Hertz) được đưa ra bởi

(1)H(S)= =ωmột2S2+2ωmộtS+ωmột2
Đây là một kết quả tiêu chuẩn mà bạn có thể dễ dàng tìm thấy trên web. Để có được bộ lọc thời gian rời rạc, bạn có thể áp dụng cái gọi là phép biến đổi song tuyến:

(2)S= =2fSz-1z+1

Ở đâu fSlà tần số lấy mẫu. Điều này là cần thiết bởi vì trục tần số của các tín hiệu tương tự (0f) cần được ánh xạ tới dải tần số cho phép đối với tín hiệu thời gian rời rạc (0ffS/2). Do phép biến đổi này làm cong các tần số, chúng ta cần tính toán tần số cắt tương tự mong muốn từ tần số cắt đã chofd trong miền thời gian rời rạc:

ωmột= =2fStan(ωd2) với ωd= =2πfd/fS

Nếu bạn chèn (2) vào (1) bạn sẽ nhận được

(3)H(z)= =kz2+b1z+b2z2+một1z+một2

với

k= =α21+2α+α2 (thu được)
một1= =2(α2-1)1+2α+α2,một2= =1-2α+α21+2α+α2,b1= =2,b2= =1

nơi tôi đã sử dụng α= =tan(ωd2). Hàm truyền (3) tương ứng với phương trình miền thời gian

y(n)= =kx(n)+kb1x(n-1)+kb2x(n-2)-một1y(n-1)-một2y(n-2)

Như bạn có thể thấy, có khá nhiều điểm tương đồng với mã của bạn. Tuy nhiên, cũng có một số khác biệt và bạn nên kiểm tra đáp ứng tần số của bộ lọc. Tôi nghĩ rằng các phương trình trên là chính xác, nhưng tùy thuộc vào bạn để kiểm tra chúng và quyết định phiên bản nào là chính xác.


Cảm ơn. Điều đầu tiên, tôi hiểu. Nhưng nó vẫn là một loạt các phao. Ý tôi là: một giá trị float duy nhất đại diện cho cái gì?
Niek van der Steen

2
Một giá trị float duy nhất là một trong những mẫu đầu vào của bạn.
Matt L.

3
Nói tóm lại: âm thanh là một biến thể của áp suất không khí, được chuyển đổi bởi một bộ chuyển đổi (micrô) thành tín hiệu điện, các biến thể theo cùng một kiểu với áp suất không khí. Biên độ của tín hiệu điện được đo N lần (= lấy mẫu) mỗi giây để mang lại chuỗi số bạn nhìn thấy trong mảng float * của bạn. Có hàng tá bài thuyết trình trực tuyến về xử lý kỹ thuật số (âm thanh) giải thích quá trình này một cách chi tiết hơn.
pichenettes

Tôi đã chỉnh sửa câu trả lời của mình để giải quyết phần cuối của câu hỏi của bạn.
Matt L.

Bạn đang sử dụng x (n - cái gì đó), x là gì? Tôi giả sử rằng 'n' là mẫu đầu vào? Câu trả lời tốt đẹp!
Niek van der Steen

11

Bạn đã hỏi làm thế nào bộ lọc thông thấp hoạt động và đề cập rằng bộ lọc sử dụng các giá trị trong quá khứ của dữ liệu của bạn. Đây là một cuộc thảo luận phi kỹ thuật về những gì xảy ra trong bộ lọc thông thấp.

Bộ lọc thông thấp có các chế độ xem khác nhau (thay đổi theo thời gian) tín hiệu của bạn, chia tỷ lệ chúng và thêm chúng lại với nhau. Bạn có thể tưởng tượng vẽ tín hiệu của mình 3 lần, một lần hiện tại, lần thứ hai được dịch chuyển bởi một lần mẫu, lần thứ ba được dịch chuyển 2 lần mẫu.

Ở tần số thấp, tất cả các chế độ xem trông rất giống nhau (dịch chuyển bởi một mẫu duy nhất hầu như không thay đổi nơi bạn đang ở trên tín hiệu bất cứ lúc nào). Trong trường hợp này, ba phiên bản sẽ cộng lại với nhau theo cách xây dựng (hoặc ít nhất là không phá hủy), do đó tín hiệu đi qua bộ lọc.

Bây giờ chuyển sang tần số cao hơn, mỗi phiên bản tín hiệu được dịch chuyển trở nên khác biệt hơn tại bất kỳ thời điểm nào (điểm mẫu) nhất định và trên thực tế thậm chí có thể đảo ngược dấu hiệu. Ở các tần số cao hơn này, ba phiên bản tín hiệu của bạn có xu hướng hủy bỏ (được thêm một cách triệt để) để tín hiệu bị suy giảm.

Các loại bộ lọc khác nhau sắp xếp cho loại nhiễu có tính xây dựng / phá hủy này diễn ra trên các dải tần số thích hợp để tạo các bộ lọc thông thấp, băng thông hoặc thông cao.


1

Nó phụ thuộc vào cách bạn muốn nó. Đối với tôi, tôi đã thực hiện trong C. Vì vậy, những gì tôi đã làm là tôi đã tạo ra các hệ số bộ lọc trong matlabviệc sử dụng firls. Sau đó, tôi lưu trữ các hệ số bộ lọc đó trong một mảng và sau đó chuyển các hệ số bộ lọc này cho hàm bộ lọc trong C. Trong matlabđó khá dễ dàng để tạo ra các hệ số bộ lọc, và sau đó sử dụng thao tác tích chập hoặc sử dụng một bộ lọc cụ thể. Nhưng trong Cbạn phải thực hiện các bộ lọc là tốt. Về phần tôi, tôi phải làm điều đó cho DSP, vì vậy đã triển khai Cvà nhận được kết quả khi matlabsử dụng chức năng mex. Để tính toán các hệ số, sử dụng lệnh này trong matlab:

n=17                  %filter order
f=[0 0.167 0.333 1]   %Frequency band edges
a=[1 1 0 0]           %Desired amplitudes
fir= firls (n, f,a )
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.