2009-03-20 3 views
6

내 프로젝트는 C로, CodeBlocks는 내 IDE이고 Windows Vista에서 실행 중입니다. 내 데이터에 버터 워스 필터를 적용해야합니다. Matlab에서는 자동으로이 작업을 수행 할 수 있습니다.이 필터는 기본 제공 함수로 사용됩니다. 컴퓨터와 프로그래밍이 정확히 내 영역이 아니며 새로운 라이브러리를 "가져온"적이 없으며이를 수행하는 방법을 모릅니다. 그것은 복잡한가요? 그리고 내가 뭘 잘할 수 있을까? 버터 워스 필터 코드를 함수로 작성 하시겠습니까? 나에게 이것을 위해 라이브러리를 "임포트"합니까? (개인적으로, 복잡하지 않다면, 아마도 다른 종류의 필터를 가지고 테스트 할 수 있기 때문에 라이브러리를 얻는 것을 선호한다)C에서 버터 워스 필터를 구현해야합니다.이 기능을 가진 라이브러리를 얻거나 코드를 작성하는 것이 더 쉽습니까?

답변

5

잘 테스트 된 외부 라이브러리를 사용하는 것이 거의 확실하고 안전하다 당신은 하나를 찾을 수 있습니다 .... 아직 구글을 시도?)보다 사소한 필터를 직접 코드.

하지만 응용 프로그램, 데이터 형식 등은 아무 것도 말하지 않았으므로 우리가 말할 수있는 것보다 더 많은 것이 있습니다.


나는 당신의 IDE (CodeBlocks)가 어떻게 작동하는지에 대해 아무것도 알고 있지만 라이브러리가 제공하는 방법을 보통 가져 오는 (자세한 따라하기) 당신에 따라 세 가지 형식 중 하나를 사용하지 않습니다

  1. 하나 이상의 기능에 대해 소스 코드을 얻습니다. 문서를 읽고 해당 디렉토리에 코드를 복사하고 프로젝트에 파일을 추가하고 컴파일을 시도하고 누락 된 선행 프로세서 심볼을 수정하십시오. ..
  2. 당신은 일반 바이너리 라이브러리와 헤더를 플랫폼 (가능하면 OS 패키지 관리 시스템에서 가져온 것임) : 문서를 읽고 헤더와 라이브러리를 찾을 위치를 알려주고 링크를 시도하여 문제를 수정하십시오.
  3. 기능을 제공하는 프레임 워크를 얻을 수 있습니다.이 문제는 좀 더 어려워 지지만, 문서를 읽은 다음 라이브러리 케이스와 비슷하지만 더 많은 코드가 작성됩니다.

어쨌든 당신은 어떤 시점에서 할 것입니다

#include "library.h" 

일부 소스 파일에서 외부 기능을 코드에 표시 할 수 있습니다.

아마도 후보 라이브러리를 먼저 찾고 해당 라이브러리가 제공되는 양식을 확인한 다음 IDE에 대해 자세히 읽고 거기에서 어디로 가는지 확인하고 싶을 것입니다.


다른 관련 질문 : Analog circuit simulation library?.


은 내가 MATLAB을 사용하기 때문에 오랜 시간이 있어요,하지만 당신의 기본 프로그래밍 경험이있는 경우, 당신은 평범한에없는 그 MATLAB 사용자에게 제공 시설의 많은있다는 것을 알고 있어야한다 기음. 거의 틀림없이 일부 프레임 워크 또는 다른 것을 사용하여 지원을 되돌리고 싶을 것입니다.

+0

확인. 도서관 가져 오기의 기본 사항을 알려주시겠습니까? –

+0

OT : Dammit, Neil이 게시하는 동안 잠을 자야합니다. 그 사람은 그 사람을 보내지 않았을 것입니다 :-) – AndreasT

3

Matlab을 사용하는 경우 C 코드에서 Matlab에 연결하는 것이 금기시 되었습니까? This이 출발점입니다. Matlab 엔진에서 C로 호출하여 Matlab 인터페이스에서 수행 할 수있는 모든 작업을 수행하도록 실제로 요청할 수 있습니다.

버터 워스 필터는 재귀 적이므로 IIR 필터로 구현해야합니다. Matlab 테스트에서 안정된 필터 계수를 얻으면 간단히 일반 IIR 알고리즘에 피드를 제공 할 수 있습니다. 큰 FIR 필터와 컨볼 루션을 사용하여 필터 응답을 근사 할 수 있습니다.이 필터는 위상 문제를 해결하기 위해 주파수 도메인으로 이동할 수 있지만 그렇게하면 Butterworth가 아닙니다.

알고리즘 학습을 처음부터 알고리즘을 작성하는 것이 좋습니다.하지만 최대한 빨리 라이브러리를 만들면 도움이 될 것입니다. This이 검색에 나왔습니다.

26

최근에 작업 한 프로젝트의 일부 데이터에 버터 워스 필터를 적용해야했습니다. (측정기가 뜨거워지기 때문에 시간이 지남에 따라 압력 측정치가 변합니다.) 실제로 라이브러리를 포함하는 것보다 훨씬 간단합니다. 당신은 정말 단 하나의 기능을 포함하고 당신이 그것을 사용할 필요가 무엇 C 파일에 추가해야

우리가 우리의 필터를 생성하는 데 사용되는 사이트입니다.

http://www-users.cs.york.ac.uk/~fisher/mkfilter/

당신이 만약을 매개 변수를 지정하면 함수가 생성됩니다. 다음은 위 웹 사이트에서 생성 한 코드를 기반으로 애플리케이션에서 사용한 함수의 예입니다. (우리는 PC에서 개발 중이기 때문에 DOUBE를 typedef하지만 임베디드 플랫폼을 목표로하므로 크기가 변하지 않는지 확인해야합니다.)

나는이 사이트를 읽는 것을 좋아합니다. 기여!

/* Butterworth filter constants */ 

#define NZEROS 4 
#define NPOLES 4 
static DOUBLE xv[NZEROS+1], yv[NPOLES+1]; 

/* Sampling rate 3000 for testing existing */ 
/* raw data. Change to 300 for final product */ 
#define SAMPLING_RATE 3000 

/******************************************************************************* 
* Function:  ButterworthFilter 
* 
* Description: This function uses the Butterworth filter and returns a new 
*    value for an individual floating point value. 
* 
* Access:  PRIVATE 
* 
* Parameters: DOUBLE input - value to be converted 
* 
* Globals:  None 
* 
* Returns:  DOUBLE - new value that has been converted 
******************************************************************************/ 
static DOUBLE ButterworthFilter (DOUBLE input) 
{ 
    /* http://www-users.cs.york.ac.uk/~fisher/cgi-bin/mkfscript */ 
    /* Butterworth Bandpass filter */ 
    /* 2nd order */ 
    /* sample rate - choice of 300 or 3000 Hz */ 
    /* corner1 freq. = 0.5 or 1 Hz */ 
    /* corner2 freq. = 20 Hz */ 
    /* removes high and low frequency noise */ 

    DOUBLE dCoefficient1 = 0.0; 
    DOUBLE dCoefficient2 = 0.0; 
    DOUBLE dCoefficient3 = 0.0; 
    DOUBLE dCoefficient4 = 0.0; 
    DOUBLE dCoefficient5 = 0.0; 
    DOUBLE dGain = 0.0; 

    /* coefficients will vary depending on sampling rate */ 
    /* and cornering frequencies       */ 
    switch(SAMPLING_RATE) 
    { 
     case 300: 
      /* 1 to 20 Hz */ 
      dCoefficient1 = 2.0; 
      dCoefficient2 = -0.5698403540; 
      dCoefficient3 = 2.5753677309; 
      dCoefficient4 = -4.4374523505; 
      dCoefficient5 = 3.4318654424; 
      dGain = 3.198027802e+01; 
      break; 

     case 3000: 
     default: 
      /* 0.5 to 20 Hz */ 
      dCoefficient1 = 2.0; 
      dCoefficient2 = -0.9438788347; 
      dCoefficient3 = 3.8299315572; 
      dCoefficient4 = -5.8282241502; 
      dCoefficient5 = 3.9421714258; 
      dGain = 2.406930558e+03; 
      break; 
    } 

    xv[0] = xv[1]; 
    xv[1] = xv[2]; 
    xv[2] = xv[3]; 
    xv[3] = xv[4]; 
    xv[4] = (DOUBLE)(input/dGain); 
    yv[0] = yv[1]; 
    yv[1] = yv[2]; 
    yv[2] = yv[3]; 
    yv[3] = yv[4]; 
    yv[4] = (DOUBLE)((xv[0] + xv[4]) - (dCoefficient1 * xv[2]) + (dCoefficient2 * yv[0]) + 
        (dCoefficient3 * yv[1]) + (dCoefficient4 * yv[2]) + 
        (dCoefficient5 * yv[3])); 

    return (yv[4]); 
} 
+2

그 웹 사이트에 대한 링크는 엄청납니다. – Kaganar

1

http://plugin.org.uk

편집에서 스티브 해리스의 SWH LADSPA 플러그인 패키지 버터 워스 (Butterworth) 필터를있다 : 지금은 C 코드가 여러 가지 이유로 RDF에 내장 된 자동으로 생성되는 기억 제외.

0

이 사람은 http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html

불행하게도, 그것은 C 코드 생성에 실패하기 시작 최고의 필터 생성기입니다. 그러나이 코드는 what Mike proposes과 비슷한 프로그램을 재현 할 수 있도록 C 코드와 가까운 형태로 충분한 정보를 가지고 있습니다. 이를 위해 별도의 라이브러리가 필요하지 않습니다. 라이브러리는 계수 (가변 컷오프 주파수)를 업데이트 할 때 유용 할 수 있습니다. 나는 당신의 프로그램에서 그 계수를 계산하는 알고리즘을 모른다.