디지털 파형 생성: 사인파 근사하기
이 예제에서는 임베디드 시스템 및 임의 파형 생성 계측기의 디지털 파형 합성 응용 사례에서 사용하기 위해 사인파 데이터 테이블을 설계하고 그 값을 계산하는 방법을 보여줍니다.
소형 시스템에서도 디지털-아날로그 변환기(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
는 기본 에너지입니다.
ET
와 EF
의 에너지 차는 스퓨리어스 에너지입니다.
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*pi
의 sin
함수로부터 반복 가능한 결과가 반환될 것이라는 가정을 테스트할 수 있습니다. 이 플롯은 입력값이 시간 기반인 경우 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
개 점씩 이동합니다. 여기서 D
는 1
부터 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.
참고 항목
Sine, Cosine | Sine Wave | Sine Wave Function
관련 항목
- Simulink의 CORDIC 알고리즘 (Fixed-Point Designer)
- Create Lookup Tables for a Sine Function (Fixed-Point Designer)