C에서 사인파의 진폭 (1에서 -1로 표시)을 포함하는 임의 길이의 부호있는 부동 배열을 생성하는 가장 효율적인 방법은 무엇입니까?C로 고정 파형 테이블을 생성하려면 어떻게해야합니까?
답변
Carl Smotricz는 his answer으로 지적 했으므로 간단한 C 프로그램을 작성하여 하드 코딩 된 배열을 쉽게 작성할 수 있습니다.
int main(int argc, char * argv[])
{
const int tableSize = 10;
const char * fileName = "sin_table.txt";
int x;
FILE * file;
file = fopen(fileName, "w");
if (file == NULL) { printf("unable to open file\n"); return -1; }
fprintf(file, "float sin_table[%d] =\n{\n ", tableSize);
for (x = 0; x < tableSize; x++)
{
fprintf(file, "\t%f,\n", sinf(x*2*pi/tableSize));
}
fprintf(file, "};\n");
fclose(file);
return 0;
}
을 그리고 출력은 다음과 같이 보일 것이다 :
다음 코드는 트릭을 할 것
float sin_table[10] =
{
0.000000,
0.587785,
0.951057,
0.951056,
0.587785,
-0.000000,
-0.587785,
-0.951057,
-0.951056,
-0.587785,
};
답변 해 주셔서 감사합니다. 매우 도움이됩니다. –
런타임 오버 헤드를 원하지 않으면 모든 값을 C 배열 선언/초기화로 인쇄 한 작은 프로그램을 작성한 다음 해당 파일을 프로그램에 #include
으로 인쇄하십시오.
당신은 (이미 제안) 매우 빠른 테이블을 사용하는 일을합니다.
또 다른 접근법은 사인 - 오실레이터를 시뮬레이트하고 데이터 어레이를 생성하는 데 사용하는 것입니다. 여기
이 작업을 수행하는 방법을 예입니다int main (int argc, char **args)
{
int i;
float data[1024];
float angle = 2.0f * 3.14/1024;
// start of the sine-wave:
float sinval = 0;
float cosval = 1;
// rotation per iteration
float delta_sin = sinf(angle);
float delta_cos = cosf(angle);
for (i=0; i<1024; i++)
{
// store current value:
data[i] = sinval;
// update the oscillator:
float s = sinval * delta_cos - cosval * delta_sin;
float c = sinval * delta_sin + cosval * delta_cos;
sinval = s;
cosval = c;
}
}
이 뒤에 트릭은 우리가 9sinval, cosval에 저장된 2D 공간에서 고정 점)로 시작하는 것이있다. 또한 (delta_cos, delta_sin)에서 한 회전에 대한 매개 변수를 미리 계산합니다.
나는 루프에서 고정 회전으로 점을 1024 번 회전시키는 것입니다. 이것은 반복마다 sin/cos 쌍을 만듭니다. (참고 : 복소 곱셈과 동일합니다).
이 방법은 조만간 불안정 해지고 루프에서 sin/cos를 호출하는 것과 같지 않습니다.
거대한 테이블을 만드는 것은 좋은 생각이 아니지만, 약간의 오류와 작은 테이블을 가지고 최대 10,000 개의 요소까지 살 수 있다면 매우 유용합니다. 이 문제를 해결하려면 유형을 두 배로 변경하고 적절한 반올림을 수행하거나 n 회 반복 할 때마다 결과를 다시 정규화하십시오.
편집 : 코드를 double 및 1e9 반복 테스트했습니다. 나를 위해 일합니다. 단계에서 약간의 드리프트가 있지만 결과는 단 정밀도 sinf/cosf보다 훨씬 정확합니다.
답변과 그에 대한 귀하의 철저한 설명에 감사드립니다. 고맙습니다! –
- 1. EclipseLink에서 MySQL InnoDB 테이블을 생성하려면 어떻게해야합니까?
- 2. 내용의 테이블을 생성하려면 파이썬
- 3. Rails 앱의 테스트 데이터베이스에 영구 테이블을 생성하려면 어떻게해야합니까?
- 4. 파이썬에서 난수를 생성하려면 어떻게해야합니까?
- 5. 새 컬렉션을 생성하려면 어떻게해야합니까?
- 6. Openx에서 통계를 다시 생성하려면 어떻게해야합니까?
- 7. C로 주소를 얻으려면 어떻게해야합니까?
- 8. iPhone에서 임의의 숫자를 생성하려면 어떻게해야합니까?
- 9. Java를 사용하여 javadoc을 생성하려면 어떻게해야합니까?
- 10. 모든 Tetrominos의 목록을 생성하려면 어떻게해야합니까?
- 11. 비슷한 스펙 문서를 생성하려면 어떻게해야합니까?
- 12. 공식 문법에서 문장을 생성하려면 어떻게해야합니까?
- 13. Subversion 커밋에서 패치를 생성하려면 어떻게해야합니까?
- 14. DTD에서 샘플 XML을 생성하려면 어떻게해야합니까?
- 15. mysql에서 바운더리 리턴을 생성하려면 어떻게해야합니까?
- 16. CUDA FORTRAN에서 난수를 생성하려면 어떻게해야합니까?
- 17. 일반 C로 스레드를 시작하려면 어떻게해야합니까?
- 18. 배열에 C로 문자열을 채우려면 어떻게해야합니까?
- 19. 안드로이드에서 C로 Java 클래스를로드하려면 어떻게해야합니까?
- 20. iPhone으로 오디오 파형 시각화
- 21. C#에서 파형 그리기
- 22. 파형 식별/생성?
- 23. 대역 제한 파형 생성
- 24. OpenGL 오디오 파형 렌더링
- 25. 스윙에서 오디오 파형 선택
- 26. MDF 테이블에 대한 SQL CREATE TABLE 문을 생성하려면 어떻게해야합니까?
- 27. 서버에서 Excel 스프레드 시트를 생성하려면 어떻게해야합니까?
- 28. 허드슨으로부터 Emma code coverage 보고서를 생성하려면 어떻게해야합니까?
- 29. 파이썬으로 노트 나 코드를 생성하려면 어떻게해야합니까?
- 30. 병합으로 인해 영향을받을 파일 목록을 생성하려면 어떻게해야합니까?
'효율적인'이란 무엇인가? 시각? 공간? 전산 복잡성? – wallyk