Main Content

디지털 파형 생성: 사인파 근사하기

이 예제에서는 임베디드 시스템 및 임의 파형 생성 계측기의 디지털 파형 합성 응용 사례에서 사용하기 위해 사인파 데이터 테이블을 설계하고 그 값을 계산하는 방법을 보여줍니다.

소형 시스템에서도 디지털-아날로그 변환기(DAC)에 연결된 디지털 신호 프로세서(DSP)와 임베디드 프로세서를 사용하는 아날로그 파형의 실시간 직접 디지털 합성 기법을 사용합니다. MATLAB®과 Simulink®를 사용하여 파형 생성 알고리즘과 관련 데이터를 개발하고 분석한 후에 타깃 하드웨어에서 Simulink® Coder™를 사용하여 구현할 수 있습니다.

디지털 방식으로 사인파를 합성하는 가장 정확한 방법은 omega*t를 구간 0~2*pi로 접어서 각 시간 스텝에 대해 직접 최대 정밀도 sin 함수를 계산하는 것입니다. 그러나 이 방법을 실시간 시스템에 적용하기에는 계산 부담이 너무 큽니다. 또는 값 테이블을 사용하여 0~2*pi 구간의 반파 또는 사분파 데이터에서 sin 함수의 동작을 근사할 수 있습니다.

두 접근 방식 간의 상호 절충 요인에는 알고리즘 효율성, 필요한 데이터 ROM 크기, 구현의 정확도 및 스펙트럼 순도 등이 있습니다. 사용자 자체 파형 설계를 수행할 때도 이와 비슷한 분석이 필요합니다. 실제 현장에서는 테이블 데이터와 룩업 알고리즘 외에도 성능을 결정하는 또 다른 요인들이 있습니다. 전체적인 성능을 평가하려면 실시간 클록의 정확도와 안정성, 디지털-아날로그 변환과 같은 추가적인 요인을 고려해야 합니다. Signal Processing Toolbox™와 DSP System Toolbox™는 이 분야의 작업에서 MATLAB 및 Simulink의 기능을 보완해 줍니다.

사인파의 동작을 근사하는 또 다른 방법은 CORDIC(COordinate Rotation DIgital Computer) 근사법을 사용하는 것입니다. 기븐스 회전 기반 CORDIC 알고리즘은 시프트-덧셈 반복 연산만 필요하기 때문에 가장 하드웨어 효율적인 알고리즘 중 하나입니다.

배정밀도 부동소수점의 테이블 만들기

다음 명령은 256개 점의 사인파를 만들고 이러한 점에서 처음 샘플링할 때의 총 고조파 왜곡을 측정한 다음, 선형 보간을 사용하여 스텝당 2.5개 점의 델타만큼씩 건너뛸 때의 총 고조파 왜곡을 측정합니다. 사인 값을 CORDIC 사인 근사로 대체하여 유사한 계산을 수행할 수 있습니다. 주파수 기반 응용 사례의 경우 테이블의 절대 오차보다 스펙트럼 순도가 더 중요할 수 있습니다.

이 예제에서 ssinthd.m 파일은 보간을 사용하거나 사용하지 않은 디지털 사인파 생성에서의 총 고조파 왜곡(THD)을 계산합니다. 이 THD 알고리즘은 정확한 결과를 얻기 위해 정수 개수만큼의 파형에 대해 수행됩니다. 여기서 사용되는 파형 주기의 개수는 A입니다. 스텝 크기 'delta'A/B입니다. A개의 파를 거치면서 테이블에 있는 모든 점과 최소 한 번 이상 일치하게 되는데, 이는 하나의 완전한 주기에서 평균 THD를 정확히 구하기 위해 필요합니다.

THD를 계산하는 데 사용되는 관계는 다음과 같습니다.

    THD = (ET - EF) / ET,

여기서 ET는 총 에너지이고, EF는 기본 에너지입니다.

ETEF의 에너지 차는 스퓨리어스 에너지입니다.

N = 256;
angle = 2*pi*(0:(N-1))/N;

s = sin(angle)';
thd_ref_1 = ssinthd(s,1,N,1,'direct' );
thd_ref_2p5 = ssinthd(s,5/2,2*N,5,'linear' );

cs = cordicsin(angle,50)';
thd_ref_1c = ssinthd(cs,1,N,1,'direct' );
thd_ref_2p5c = ssinthd(cs,5/2,2*N,5,'linear' );

모델에 근사 사인파 사용하기

설계한 사인파를 Simulink 모델에 배치하여 선형 보간을 사용한 경우와 CORDIC 근사를 사용한 경우에 이러한 근사가 직접 룩업으로서 어떻게 작동하는지 살펴볼 수 있습니다. 이 모델은 부동소수점 테이블의 출력값을 sin 함수와 비교합니다. THD 계산에서 예상할 수 있듯이 선형 보간은 sin 함수와 비교해 볼 때 직접 테이블 룩업보다 오차가 작습니다. CORDIC 근사는 선형 보간 방법에 비해 오차 범위가 작습니다. 이 범위는 CORDIC sin 근사를 계산할 때의 반복 횟수에 따라 달라집니다. 일반적으로 반복 횟수를 늘리면 정확도가 높아집니다. CORDIC 근사에서는 명시적 곱셈기가 필요하지 않습니다. 이는 곱셈기가 비교적 덜 효율적이거나 하드웨어에 존재하지 않는 경우에 사용됩니다.

sldemo_tonegen 모델을 열고 시뮬레이션합니다.

open_system('sldemo_tonegen');
set_param('sldemo_tonegen', 'StopFcn','');
out = sim('sldemo_tonegen');

시뮬레이션 출력을 플로팅합니다.

currentFig = figure('Color',[1,1,1]);
subplot(3,1,1), plot(out.tonegenOut.time, out.tonegenOut.signals(1).values); grid
title({'Difference between direct lookup', 'and reference signal'});
subplot(3,1,2), plot(out.tonegenOut.time, out.tonegenOut.signals(2).values); grid
title({'Difference between interpolated lookup', 'and reference signal'});
subplot(3,1,3), plot(out.tonegenOut.time, out.tonegenOut.signals(3).values); grid
title({'Difference between CORDIC sine', 'and reference signal'});

파형 정확도 검사하기

신호를 검사하면 다양한 알고리즘의 다양한 특성을 확인할 수 있습니다. 예를 들어, 시뮬레이션 시간 4.5초~5.2초 사이의 신호를 확대해 보겠습니다.

ax = get(currentFig,'Children');
set(ax(3),'xlim',[4.8, 5.2]);
set(ax(2),'xlim',[4.8, 5.2]);
set(ax(1),'xlim',[4.8, 5.2]);

고정소수점으로 테이블 구현하기

부동소수점 테이블을 가장 가까운 값으로의 반올림을 사용하여 24비트 소수로 변환할 수 있습니다. 직접 룩업 모드로 스텝당 1개, 2개, 3개 점에서 총 고조파 왜곡에 대해 새 테이블을 테스트한 다음, 고정소수점 선형 보간을 사용해 테스트합니다.

bits = 24;
is = num2fixpt(s,sfrac(bits),[],'Nearest','on');

thd_direct1 = ssinthd(is,1,N,1,'direct');
thd_direct2 = ssinthd(is,2,N,2,'direct');
thd_direct3 = ssinthd(is,3,N,3,'direct');

thd_linterp_2p5 = ssinthd(is,5/2,2*N,5,'fixptlinear');

결과 비교하기

스텝당 8.25개 점의 테이블 스텝 레이트(33/4)를 선택하여 직접 모드와 선형 모드에서 배정밀도 테이블과 고정소수점 테이블을 빠르게 통과한 다음 왜곡 결과를 비교해 봅니다.

thd_double_direct = ssinthd(s,33/4,4*N,33,'direct');
thd_sfrac24_direct= ssinthd(is,33/4,4*N,33,'direct');

thd_double_linear = ssinthd( s,33/4,4*N,33,'linear');
thd_sfrac24_linear = ssinthd(is,33/4,4*N,33,'fixptlinear');

미리 구성된 Sine Wave 블록 사용하기

Simulink에는 연속 및 이산 모드를 갖는 Sine Wave 블록과, 사인 및 코사인의 사분파 대칭성을 활용하는 선형 보간된 룩업 테이블로 함수 근사를 구현하는 고정소수점 Sine 함수 블록 및 Cosine 함수 블록도 있습니다. sldemo_tonegen_fixpt 모델은 샘플링된 사인파 소스를 기준 신호로 사용하여 보간을 사용하거나 사용하지 않은 룩업 테이블과 비교하고, 고정소수점 데이터형의 CORDIC 사인 근사와 비교합니다.

sldemo_tonegen_fixpt 모델을 엽니다.

open_system('sldemo_tonegen_fixpt');
set_param('sldemo_tonegen_fixpt', 'StopFcn','');
out = sim('sldemo_tonegen_fixpt');

시뮬레이션 출력을 플로팅합니다.

figure('Color',[1,1,1]);
subplot(3,1,1), plot(out.tonegenOut.time, out.tonegenOut.signals(1).values); grid
title({'Difference between direct lookup', 'and reference signal'});
subplot(3,1,2), plot(out.tonegenOut.time, out.tonegenOut.signals(2).values); grid
title({'Difference between interpolated lookup', 'and reference signal'});
subplot(3,1,3), plot(out.tonegenOut.time, out.tonegenOut.signals(3).values); grid
title({'Difference between CORDIC sine', 'and reference signal'});

클록 입력을 갖는 사인 함수 사용하기

모델은 또한 사인파 소스 기준을 입력 각도(단위: 라디안)가 시간 기반이거나 클록을 사용하여 계산된 sin 함수와 비교합니다. 클록 입력에 의해 주기 2*pisin 함수로부터 반복 가능한 결과가 반환될 것이라는 가정을 테스트할 수 있습니다. 이 플롯은 입력값이 시간 기반인 경우 sin 함수가 오차를 누적한다는 사실을 보여줍니다. 또한 샘플링된 사인파 소스가 파형 생성기로 사용하기에 더 정확하다는 사실도 보여줍니다.

subplot(1,1,1), plot(out.tonegenOut.time, out.tonegenOut.signals(4).values); grid
title({'Difference between time-based sin function', 'and reference signal'});

직접 룩업 및 선형 보간에 대한 동작 조사

고정소수점 테이블에 대한 전체 주파수 스윕을 수행하고 이 설계의 동작에 대한 통찰력을 얻으려면 파일 sldemo_sweeptable_thd.m을 실행하십시오. 24비트 소수 고정소수점 테이블의 총 고조파 왜곡은 각 스텝 크기에서 측정되며 한 번에 D개 점씩 이동합니다. 여기서 D1부터 N/2까지 0.25개 점씩 증가하는 숫자입니다. 이 예제에서 N은 256개 점입니다. 주파수는 이산이므로 샘플 레이트의 함수입니다.

플롯에서 왜곡 동작의 모드를 살펴보십시오. 정확히 테이블의 점에서 가져올 때 오차가 가장 작습니다. 선형 보간이 점 사이에서의 직접 룩업보다 오차가 작습니다. 하지만 각 모드에서 나이퀴스트 주파수까지 오차는 비교적 일정합니다.

figure('Color',[1,1,1]);
tic, sldemo_sweeptable_thd(24, 256), toc;
Elapsed time is 1.052861 seconds.

다음 단계

CORDIC 근사를 사용하여, 다른 반복 횟수로 이 예제를 실행해 정확도와 계산 시간에 미치는 영향을 살펴볼 수 있습니다. Simulink Coder의 자동 코드 생성 기능과 Embedded Coder™의 프로덕션 코드 생성 기능을 사용하여 파형 합성 알고리즘의 여러 구현 옵션을 시도해 보십시오. 임베디드 타깃 제품은 타깃이 실시간으로 실행 중일 때 Simulink 모델과 역으로 연결하는 것을 포함하여 여러 실시간 프로세서 및 DSP에 대한 직접 연결을 제공합니다. Signal Processing Toolbox와 DSP System Toolbox는 MATLAB 및 Simulink를 사용하여 다양한 샘플 기반 및 프레임 기반 신호 처리 시스템을 설계하고 구현하기 위한 기능을 제공합니다.

참고 문헌

[1] Chrysafis, Andrea. "Digital Sine-Wave Synthesis Using the DSP56001/2." Motorola, 1988.

참고 항목

| |

관련 항목