<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Moon.Ryu</title>
        <description>Sharing insights and explorations in AI, speech synthesis with a focus on clear and concise explanations.</description>
        <link>/</link>
        <atom:link href="/feed.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Wed, 11 Mar 2026 13:10:31 +0000</pubDate>
        <lastBuildDate>Wed, 11 Mar 2026 13:10:31 +0000</lastBuildDate>
        <generator>Jekyll v3.10.0</generator>
        
            <item>
                <title>Generative Modeling via Drifting (arXiv 2026)</title>
                <description>&lt;h1 id=&quot;디퓨전-없이도-생성이-가능할까&quot;&gt;디퓨전 없이도 생성이 가능할까?&lt;/h1&gt;

&lt;h2 id=&quot;drifting-model은-왜-학습과정-자체를-생성-경로로-바꾸려-했을까&quot;&gt;&lt;em&gt;Drifting Model은 왜 “학습과정 자체”를 생성 경로로 바꾸려 했을까&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;생성 모델을 처음 배울 때 가장 자연스럽게 떠오르는 그림은 이렇다.&lt;br /&gt;
노이즈에서 시작해서, 여러 번의 정제를 거쳐, 조금씩 데이터 분포에 가까워지는 과정. 디퓨전도 그렇고, 플로우 매칭도 그렇다. 결국 추론 과정에서 여러 단계의 변환을 거쳐 복잡한 pushforward를 만들어내는 방식이다.&lt;/p&gt;

&lt;p&gt;그런데 이 논문은 질문을 조금 다르게 던진다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;정말 그 복잡한 변환을 추론 시간에 해야만 할까?&lt;/strong&gt;&lt;br /&gt;
어차피 딥러닝의 학습은 본질적으로 반복적이다. 그렇다면 그 반복적인 학습 과정 자체가, 노이즈 분포를 데이터 분포 쪽으로 끌고 가는 “누적된 변환”이 될 수 있지 않을까.&lt;/p&gt;

&lt;p&gt;이 논문이 제안하는 &lt;strong&gt;Drifting Model&lt;/strong&gt;은 바로 그 생각에서 출발한다. 매 추론 단계에서 경로를 적분하는 대신, 학습 중에 샘플이 어느 방향으로 움직여야 하는지 알려주는 드리프팅 필드를 정의하고, 네트워크가 그 방향을 학습하도록 만든다. 그 결과 최종 추론은 놀랍게도 &lt;strong&gt;1 step&lt;/strong&gt;이면 충분하다. 실제로 ImageNet 256x256에서 저자들의 최종 모델은 1-NFE 설정으로 &lt;strong&gt;FID 1.54&lt;/strong&gt;를 기록했고, 당시 기준으로 1-step 생성 모델 중 매우 강한 성능을 보여주었다.&lt;/p&gt;

&lt;p&gt;이 글에서는 논문의 전체 흐름을 따라가되, 단순한 요약보다는&lt;br /&gt;
“이 논문이 무엇을 하려는지”,&lt;br /&gt;
“왜 그런 설계를 했는지”,&lt;br /&gt;
“흥미로운 지점들”&lt;br /&gt;
을 중심으로 설명해보려 한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;생성은-결국-pushforward를-배우는-일이다&quot;&gt;생성은 결국 pushforward를 배우는 일이다&lt;/h1&gt;

&lt;p&gt;생성 모델의 출발점은 간단하다.&lt;br /&gt;
사전 분포 $p_\epsilon$ 에서 노이즈 $\epsilon$ 를 뽑고, 신경망 $f_\theta$ 를 통과시켜 샘플 $x = f_\theta(\epsilon)$ 을 만든다. 이때 모델이 만들어내는 전체 샘플 분포를 $q_\theta$ 라고 쓰면,&lt;/p&gt;

\[q_\theta = f_{\theta\#} p_\epsilon\]

&lt;p&gt;라고 쓸 수 있다. 말 그대로, $f_\theta$ 가 prior를 밀어낸(pushforward) 결과가 생성 분포라는 뜻이다.&lt;/p&gt;

&lt;p&gt;그러니 생성 모델의 목적은 결국 하나다.&lt;/p&gt;

\[f_{\theta\#} p_\epsilon \approx p_\text{data}\]

&lt;p&gt;즉, 사전 분포를 데이터 분포처럼 보이게 만드는 변환을 학습하는 것.&lt;/p&gt;

&lt;p&gt;디퓨전과 플로우 계열 모델은 이 변환을 “한 번에” 하지 않는다. 대신 아주 많은 작은 변환으로 나누어 추론 과정에서 점진적으로 적용한다. 반면 Drifting Model은 이 누적 변환을 추론 시점이 아니라 학습 시점으로 옮기려는 시도에 가깝다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;images/20260311_DRIFTING/figure1.png&quot; alt=&quot;figure1&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;추론-경로를-학습과정에-밀어-넣기&quot;&gt;추론 경로를 학습과정에 밀어 넣기&lt;/h1&gt;

&lt;p&gt;이 논문에서 가장 흥미로운 점은, 생성 샘플을 정제하는 연산을 별도의 ODE solver나 diffusion trajectory로 두지 않았다는데 있다.&lt;/p&gt;

&lt;p&gt;저자들은 다음과 같은 관점을 취한다.&lt;/p&gt;

&lt;p&gt;학습 도중 파라미터가 계속 바뀌면, 같은 노이즈 $\epsilon$ 을 넣어도 모델이 내는 샘플은 조금씩 달라진다.&lt;br /&gt;
즉 학습 단계 $i$ 에서의 샘플 $x_i = f_{\theta_i}(\epsilon)$ 은, 다음 단계에서&lt;/p&gt;

\[x_{i+1} = x_i + \Delta x_i\]

&lt;p&gt;처럼 움직인다.&lt;/p&gt;

&lt;p&gt;그렇다면 생성 모델을 학습한다는 것은, 본질적으로 샘플을 데이터 분포 쪽으로 조금씩 이동시키는 규칙을 학습하는 것과도 같다.&lt;/p&gt;

&lt;p&gt;이 “조금씩 이동시키는 규칙”이 정해지는 곳이 바로 &lt;strong&gt;드리프팅 필드&lt;/strong&gt;다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;드리프팅-필드는-다음에-어디로-가야하는지를-말해주는-벡터장이다&quot;&gt;드리프팅 필드는 “다음에 어디로 가야하는지”를 말해주는 벡터장이다&lt;/h1&gt;

&lt;p&gt;논문에서 드리프팅 필드 $\mathbf{V}_{p, q}$ 는 현재 샘플 $x$ 가&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;실제 데이터 분포 $p$ 쪽으로는 끌리고,&lt;/li&gt;
  &lt;li&gt;현재 생성 분포 $q$ 쪽에서는 밀려나도록&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;정의되는 벡터장이다.&lt;/p&gt;

&lt;p&gt;즉 샘플 업데이트는 다음처럼 생각할 수 있다.&lt;/p&gt;

\[x_{i+1} := x_i + \mathbf{V}_{p, q_i}(x_i)\]

&lt;p&gt;여기서 중요한 건, 이 벡터장이 단순히 “그럴듯한 방향”이 아니라, 최종적으로 평형 상태를 갖도록 설계되어야 한다는 점이다.&lt;/p&gt;

&lt;p&gt;만약 현재 생성 분포 $q$ 가 이미 데이터 분포 $p$ 와 같아졌다면, 더 이상 움직일 이유가 없어야 한다. 그러므로 이상적인 드리프팅 필드는&lt;/p&gt;

\[q = p \quad \Rightarrow \quad \mathbf{V}_{p, q}(x) = 0\]

&lt;p&gt;을 만족해야 한다. 논문은 이를 보장하기 위한 충분조건으로 반대칭성(anti-symmetry)&lt;/p&gt;

\[\mathbf{V}_{p, q}(x) = -\mathbf{V}_{p, q}(x)\]

&lt;p&gt;을 둔다. 그러면 $p=q$ 일 때, $\mathbf{V}_{p, p}=0$ 이 자동으로 따라온다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;움직이지-않는다는-것이-정말-정답에-도달했다는-뜻일까&quot;&gt;“움직이지 않는다”는 것이 정말 “정답에 도달했다”는 뜻일까&lt;/h1&gt;

&lt;p&gt;이 논문에서 흥미로운 지점 중 하나가 바로 여기다.&lt;/p&gt;

&lt;p&gt;$p=q$ 이면 drift가 0이 되어야 한다는 것은 이해하기 쉽다.
하지만 그 역, 즉&lt;/p&gt;

\[\mathbf{V}_{p, q}(x) = 0 \quad\Rightarrow\quad p=q\]

&lt;p&gt;는 일반적으로 자동으로 성립하지 않는다. 논문도 이 점을 분명히 인정한다. 임의의 벡터장에서는 zero-drift가 곧 distribution matching을 의미하지 않을 수 있다.&lt;/p&gt;

&lt;p&gt;이 부분을 나는 줄다리기 비유로 이해하는 편이 좋았다.&lt;/p&gt;

&lt;p&gt;완전히 동일한 힘이 양쪽에서 작용하면 줄은 움직이지 않는다.&lt;br /&gt;
하지만 줄이 움직이지 않는다고 해서, 양쪽 사람이 동일하다고 결론 낼 수는 없다.&lt;/p&gt;

&lt;p&gt;즉, &lt;strong&gt;정지 상태와 정답 상태는 다르다&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;논문 후반부와 부록에서는 바로 이 문제,&lt;br /&gt;
“왜 zero-drift가 단순한 정지가 아니라 distribution matching에 가까운 제약이 되는가”&lt;br /&gt;
를 설명한다. 완전히 일반적인 정리는 아니지만, 자신들이 제안한 kernelized drifting field에서는 그 조건이 꽤 강한 제약이 된다고 주장한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;drift의-크기를-줄이도록-하는-손실함수&quot;&gt;Drift의 크기를 줄이도록 하는 손실함수&lt;/h1&gt;

&lt;p&gt;이상적인 fixed point는&lt;/p&gt;

\[f_{\hat{\theta}}(\epsilon) = f_{\hat{\theta}}(\epsilon) + \mathbf{V}_{p, \hat{q}_\theta}(f_\hat{\theta}(\epsilon))\]

&lt;p&gt;형태다. 즉 이미 평형에 도달했다면 drift를 한 번 적용해도 샘플이 바뀌지 않는다. 논문은 이 업데이트를 loss로 바꾸어 다음과 같이 쓴다.&lt;/p&gt;

\[\mathcal{L} = \mathbb{E}_\epsilon \left[ \| f_\theta(\epsilon) - \texttt{stopgrad}(f_\theta(\epsilon) - \mathbf{V}_{p, q_\theta}(f_\theta(\epsilon)))] \|_2^2 \right]\]

&lt;p&gt;핵심은 오른쪽 항이 &lt;strong&gt;frozen target&lt;/strong&gt;이라는 점이다.&lt;/p&gt;

&lt;p&gt;즉 현재 샘플을 drift를 한 번 적용한 위치까지 이동시켜 놓고, 그 위치를 이번 iteration에서는 고정된 목표점처럼 취급한다. 논문도 stop-gradient가 “frozen state”를 제공하고, 네트워크 예측을 그 frozen target 쪽으로 이동시키는 방식이라고 설명한다.&lt;/p&gt;

&lt;p&gt;여기서 stopgrad는 단순한 구현 트릭이 아니다.&lt;br /&gt;
오히려 이 논문의 주요 장치로 작용한다.&lt;/p&gt;

&lt;p&gt;왜냐하면 drift \(\mathbf{V}_{p, q_\theta}(x)\) 는 샘플 하나 \(x\) 만의 함수가 아니라, 현재 generator 전체가 유도한 분포 \(q_\theta\) 에도 의존하기 때문이다. 즉 이를 그대로 미분하려면 샘플 하나가 아니라 분포 자체의 변화를 함께 따라가야 한다. 논문은 바로 이 점 때문에 \(\mathbf{V}\) 를 직접 backpropagate 하지 않고, drifted target을 고정해 간접적으로 최적화한다고 말한다.&lt;/p&gt;

&lt;p&gt;조금 추상적으로 말하면,&lt;br /&gt;
“&lt;strong&gt;분포를 직접 미분하는 대신, 분포가 가리키는 다음 위치를 정답처럼 만들어 회귀한다&lt;/strong&gt;”&lt;br /&gt;
라고 이해하면 된다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;드리프팅-필드는-어떻게-계산할까&quot;&gt;드리프팅 필드는 어떻게 계산할까&lt;/h1&gt;

&lt;p&gt;이제 진짜 중요한 질문이 남는다.&lt;br /&gt;
도대체 $\mathbf{V}_{p, q}(x)$ 는 어떻게 정의해야 할까.&lt;/p&gt;

&lt;p&gt;논문은 가장 일반적인 형태로 다음을 둔다.&lt;/p&gt;

\[\mathbf{V}_{p, q}(\mathbf{x}) = \mathbb{E}_{\mathbf{y}^+\sim p} \mathbb{E}_{\mathbf{y}^-\sim q} [\mathcal{K}(x, \mathbf{y}^+, \mathbf{y}^-)]\]

&lt;p&gt;즉&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;positive 쪽으로 가는 &lt;strong&gt;인력(attraction)&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;negative 쪽으로 가는 &lt;strong&gt;척력(repulsion)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;의 차로 drift를 만든다. Figure 2가 바로 이 해석을 시각적으로 보여준다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;images/20260311_DRIFTING/figure2.png&quot; alt=&quot;figure2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;수식으로 쓰면,&lt;/p&gt;

\[\begin{aligned}
\mathbf{V}_p^+ (\mathbf{x}) &amp;amp;:= \frac{1}{Z_p} \mathbb{E}_p [k(\mathbf{x}, \mathbf{y}^+)(\mathbf{y}^+ - \mathbf{x})], \quad Z_p(\mathbf{x}) := \mathbb{E}_p[k(\mathbf{x}, \mathbf{y}^+)] \\ \mathbf{V}_q^- (\mathbf{x}) &amp;amp;:= \frac{1}{Z_q} \mathbb{E}_q [k(\mathbf{x}, \mathbf{y}^-)(\mathbf{y}^- - \mathbf{x})], \quad Z_q(\mathbf{x}) := \mathbb{E}_q[k(\mathbf{x}, \mathbf{y}^-)]
\end{aligned}\]

&lt;p&gt;이다.&lt;/p&gt;

&lt;p&gt;겉보기에는 단순하지만, 이 구조 덕분에 드리프팅 필드는 “실제 데이터에는 끌리고, 현재 생성이 몰린 곳에서는 밀려나는” 매우 직관적인 mean shift 형태를 갖게 된다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;generated-sample-의-정의&quot;&gt;Generated sample 의 정의&lt;/h1&gt;

&lt;p&gt;이 논문을 처음 읽을 때 헷갈렸던 부분이다.&lt;br /&gt;
Negative sample $y^-$ 를 generated sample에서 뽑는다면, 그럼 $x$ 는 뭐지?&lt;/p&gt;

&lt;p&gt;정확히 말하면, $x$ 역시 현재 배치에서 generator가 만든 샘플 중 하나다.&lt;br /&gt;
구현에서는 보통 현재 배치 전체를 generated samples로 만들고, 그 배치 자체를 negative pool로 재사용한다. 즉 각 샘플은 어떤 순간에는 “지금 drift를 계산할 기준점 $x$”가 되고, 다른 샘플의 관점에서는 negative reference $y^-$ 가 된다. 논문의 의사코드도 바로 이런 형태를 쓴다.&lt;/p&gt;

&lt;div class=&quot;language-py highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;randn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# generated samples
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y_neg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;         &lt;span class=&quot;c1&quot;&gt;# reuse generated samples as negatives
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;V&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compute_V&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_pos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_neg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x_drifted&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stopgrad&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;V&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mse_loss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_drifted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;즉 각 샘플마다 $\mathbf{V}(x_i)$ 를 따로 계산해야 하지만, 실제 구현은 for-loop가 아니라 batch 전체에 대한 pairwise distance matrix와 softmax, 행렬곱을 통해 한 번에 처리한다. 논문 부록의 Algorithm 2가 바로 그 계산 방식을 정확히 따르고 있다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;커널함수로-사용한-rbf-softmax를-통한-구현&quot;&gt;커널함수로 사용한 RBF, softmax를 통한 구현&lt;/h1&gt;

&lt;p&gt;논문은 샘플간 유사도를 재는 커널로 다음을 사용한다.&lt;/p&gt;

\[k(\mathbf{x}, \mathbf{y}) = \exp \left(-\frac{1}{\tau} \|\mathbf{x-y} \|_2\right)\]

&lt;p&gt;즉 $\ell_2$ 거리가 가까운 샘플일수록 큰 값을 주는 RBF류 커널이다. 여기서 $\tau$ 는 얼마나 local 하게 볼지를 정하는 temperature 다.&lt;/p&gt;

&lt;p&gt;그런데 논문은 이를 구현할 때, 정규화된 커널 $\tilde{k}$ 를 softmax로 계산한다고 말한다.&lt;br /&gt;
이건 커널을 다른 함수로 바꾼다는 뜻이 아니라,&lt;/p&gt;

\[\tilde{k}(x, y_i) = \frac{\exp(-\|x-y_i\|/\tau)}{\sum_j\exp(-\|x-y_j\|/\tau)}\]

&lt;p&gt;처럼 각 $x$ 에 대해 후보 $y$ 들 사이에서 정규화한 가중치를 쓴다는 뜻이다. 즉 softmax의 logit이 단지 $-|x-y_i|/\tau$ 일 뿐이다. 논문도 이를 InfoNCE의 softmax와 유사하다고 설명한다.&lt;/p&gt;

&lt;p&gt;왜 $y$ 축으로 정규화하느냐도 자연스럽다.&lt;br /&gt;
Drift는 “하나의 $x$ 가 여러 후보 $y$ 중 누구에게 얼마나 끌리거나 밀릴지”를 정하는 것이므로, 각 $x$ 에 대해 $y$ 후보들 사이에서 weight를 나누는 것이 맞다.&lt;/p&gt;

&lt;p&gt;논문은 여기에 더해 $x$ 축 정규화도 한 번 더 넣으면 약간의 성능 향상이 있었다고 보고한다. 부록의 ablation을 보면 정규화가 없는 경우보다 $y$-softmax를 넣은 경우가 확실히 좋고, $x+y$ 이중 정규화를 넣으면 조금 더 좋아진다. 결국 이 방법은 단순히 “가깝다/멀다”를 보는 것을 넘어서, batch 수준에서 더 안정적인 similarity geometry를 만들려는 시도에 가깝다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;drifting-model이-잘-동작하기-위한-임베딩-공간의-설정&quot;&gt;Drifting model이 잘 동작하기 위한 임베딩 공간의 설정&lt;/h1&gt;

&lt;p&gt;그리고 이 지점에서 feature encoder 이야기가 등장한다.&lt;/p&gt;

&lt;p&gt;논문은 드리프팅을 꼭 픽셀 공간에서 계산할 필요가 없다고 말한다. 오히려 고차원 데이터ㅓ에서는 feature spaceㅔㅇ서 drift를 계산하는 것이 더 유리할 수 있다고 본다. 실제로 저자들은 여러 scale/location의 feature에 대해서 drifting loss를 계산하고, 그게 richer gradient information을 준다고 설명한다.&lt;/p&gt;

&lt;p&gt;Feature-space loss는 다음처럼 작성할 수 있다.&lt;/p&gt;

\[\mathbb{E} \bigg[ \bigg\| \phi(\mathbf{x}) - \texttt{stopgrad} \left( \phi(\mathbf{x}) + \mathbf{V}(\phi(\mathbf{x})) \right)\bigg\|^2\bigg]\]

&lt;p&gt;이 식은 얼핏 perceptual loss와 비슷해보이지만, 논문은 둘이 개념적으로 다르다고 선을 긋는다.&lt;/p&gt;

&lt;p&gt;Perceptual loss는 $x$ 와 짝지어진 정답 $x_\text{target}$ 의 feature $\phi(x_\text{target})$ 을 회귀 목표로 삼는다. 반면 drifting의 target은 $\phi(x) + V(\phi(x))$, 즉 현재 feature를 distribution-level drift 방향으로 한 번 이동시킨 값이다. 그래서 이 loss는 paired target이 없이도 되고, 원리적으로는 feature space의 pushforward 분포 $\phi_\# q$ 와 $\phi_\# p$ 를 맞추려는 목적을 갖는다.&lt;/p&gt;

&lt;p&gt;이 대목은 이 논문을 단순한 perceptual regression과 구분해주는 중요한 문장이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;왜-ssl-feature-encoder가-필요할까&quot;&gt;왜 SSL feature encoder가 필요할까&lt;/h1&gt;

&lt;p&gt;이 논문에서 feature encoder는 선택사항처럼 보이지만, 실제로는 거의 핵심 부품에 가깝다.&lt;/p&gt;

&lt;p&gt;저자들은 자기 방법이 커널 $k(\cdot, \cdot)$ 로 샘플 유사도를 재기 때문에, feature space에서 의미론적으로 비슷한 샘플이 실제로 가까이 위치하는 것이 중요하다고 설명한다. 그리고 이 목표가 SSL과 잘 맞는다고 말한다. 그래서 pre-trained SSL 모델을 feature extractor로 사용한다.&lt;/p&gt;

&lt;p&gt;왜 SSL 이 적합한지는 생각보다 직관적이다.&lt;/p&gt;

&lt;p&gt;SSL 은 본질적으로&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;같은 입력의 다른 view는 비슷한 representation으로 보내고,&lt;/li&gt;
  &lt;li&gt;다른 샘플들은 구분되는 방향으로&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;feature space를 학습한다. 그러면 $\phi(x)$ 공간에서의 거리 $| \phi(x) - \phi(y) |$ 가 단순한 픽셀 차이보다 더 “의미 있는 유사도”가 되기 쉽다. 그리고 drifting은 바로 그 거리 위에 RBF 커널을 얹어 작동한다.&lt;/p&gt;

&lt;p&gt;즉, 좋은 SSL encoder는 drifting에 필요한 좋은 거리 공간을 제공하는 셈이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;simclr-moco-v2-도-좋지만-latent-mae가-더-좋았다&quot;&gt;SimCLR, MoCo-v2 도 좋지만, latent-MAE가 더 좋았다&lt;/h1&gt;

&lt;p&gt;논문 7페이지의 표3은 꽤 중요한 실험을 보여준다.&lt;/p&gt;

&lt;p&gt;저자들은 public pre-trained SSL 인코더인 SimCLR과 MoCo-v2도 비교했고, 둘다 나쁘지 않은 결과를 냈다. 하지만 자신들이 설계한 latent-MAE가 더 좋았고, width와 pretrain epoch을 늘릴수록 성능이 계속 좋아졌다. 특히 latent-MAE를 640 width, 1280 epoch로 pretrain하고 classification fine-tuning 까지 붙인 설정은 FID 3.36 까지 내려간다.&lt;/p&gt;

&lt;p&gt;여기서 중요한 건, “SimCLR과 MoCo-v2가 SSL 이 아니어서 안 좋았다”는 게 아니라는 점이다.&lt;br /&gt;
둘 다 SSL 인코더가 맞다. 문제는 어느 공간에서 feature를 뽑느냐다.&lt;/p&gt;

&lt;p&gt;SimCLR과 MoCo-v2는 기본적으로 pixel-domain 인코더다.&lt;br /&gt;
그런데 이 논문의 generator는 SD-VAE latent 공간 (32, 32, 4) 에서 작동한다. 그러므로 pixel-space SSL encoder를 사용하려면, 학습 중 매번 VAE decoder 를 돌려 latent를 이미지로 복원한 뒤 feature 를 뽑아야 한다. 논문은 바로 이 점을 지적하고, 이를 우회하기 위해 latent space 위에서 직접 pretrain한 ResNet-style latent-MAE를 도입했다고 설명한다.&lt;/p&gt;

&lt;p&gt;결국 latent MAE가 더 좋았던 이유는 2가지로 요약된다.&lt;/p&gt;

&lt;p&gt;첫째, 생성 공간과 feature 공간의 mismatch를 줄였다.&lt;br /&gt;
둘째, 좋은 feature encoder일수록 커널이 너무 flat해지지 않고, 가까운 샘플들 사이에서 더 강한 drift를 만들어 richer training signal을 준다.&lt;/p&gt;

&lt;p&gt;논문도 표3 아래에서 바로 이 해석을 제시한다. 강한 feature encoder는 거의 0이 되어버리는 flat kernel의 발생을 줄여주며, 샘플 간 유사도를 더 잘 반영한다고 말한다. 심지어 저자들은 feature encoder 없이 ImageNet에서 모델을 제대로 작동시키지 못했다고도 적는다.&lt;/p&gt;

&lt;p&gt;이 문장은, 이 논문이 단순히 “drift라는 아이디어만 좋다”로 끝나지 않는다는 걸 잘 보여준다.&lt;br /&gt;
좋은 drift를 만들려면, 그 전에 좋은 similarity geometry가 필요하다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;classifier-free-guidance의-재해석&quot;&gt;Classifier Free Guidance의 재해석&lt;/h1&gt;

&lt;p&gt;이 논문은 Classifier-Free Guidance(CFG)도 drifting 관점으로 다시 쓴다.&lt;/p&gt;

&lt;p&gt;조건 클래스 $c$ 가 주어지면, positive는 $p_\text{data}(\cdot \mid c)$ 에서 뽑으면 된다.&lt;br /&gt;
그런데 guidance를 얻으려면 negative도 단순히 생성 샘플만으로는 부족할 수 있다. 그래서 저자들은 negative 분포를&lt;/p&gt;

\[\tilde{q}(\cdot \mid c) \triangleq (1-\gamma) q_\theta(\cdot \mid c) + \gamma p_\text{data}(\cdot \mid \varnothing)\]

&lt;p&gt;처럼 정의한다. 논문 본문은 $p_\text{data}(\cdot \mid \varnothing)$ 를 unconditional data distribution으로 쓰지만, 각주에서는 엄밀히는 조건 크래스 $c$ 를 제외한 다른 크래스들의 분포를 뜻한다고 설명한다.&lt;/p&gt;

&lt;p&gt;이 식을 풀면,&lt;/p&gt;

\[q_\theta(\cdot \mid c) = \alpha p_\text{data}(\cdot \mid c) - (\alpha - 1) p_\text{data}(\cdot \mid \varnothing)\]

&lt;p&gt;가 나오고, 여기서 $\alpha = 1/(1-\gamma)$ 다.&lt;/p&gt;

&lt;p&gt;이 식은 CFG가 왜 “조건부 분포를 강화하고 비조건부 분포를 빼는 방식”인지 잘 보여준다. 논문도 이 formulation이 original CFG의 spirit과 맞닿아 있다고 설명한다.&lt;/p&gt;

&lt;p&gt;개인적으로는 이 부분을 읽고, CFG를 다시 분포의 외삽(extrapolation)으로 이해하게 되었다.&lt;br /&gt;
고양이를 만들 때 단지 진짜 고양이 쪽으로만 가는 것이 아니라, 고양이가 아닌 실제 데이터 manifold와도 멀어지게 만드는 것. Drifting 관점은 이 구조를 자연스럽게 설명한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;배치를-구성하는-방법&quot;&gt;배치를 구성하는 방법&lt;/h1&gt;

&lt;p&gt;논문의 5페이지는 class label을 기준으로 배치를 구성한다고 설명한다.&lt;/p&gt;

&lt;p&gt;먼저 $N_c$ 개의 클래스 라벨을 샘플링하고, 각 라벨마다 Algorithm 1을 독립적으로 수행한다. 클래스 하나당 $N = N_\text{neg}$ 개의 generated negatives와 $N_\text{pos}$ 개의 positive를 준비하며, 전체 effective batch size는&lt;/p&gt;

\[B=N_c \times N\]

&lt;p&gt;가 된다. 즉 하나의 배치는 사실 여러 개의 “클래스별 작은 배치”들을 묶은 형태에 가깝다.&lt;/p&gt;

&lt;p&gt;이 구조는 drifting이 단순히 전체 생성분포를 맞추는 것에 그치지 않고, 조건부 분포별로도 작동하도록 만들어준다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;toy-실험으로-보는-분포의-변화&quot;&gt;Toy 실험으로 보는 분포의 변화&lt;/h1&gt;

&lt;p&gt;논문은 단순한 toy example도 보여준다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;images/20260311_DRIFTING/figure3.png&quot; alt=&quot;figure3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;이봉(binomial) 분포를 목표로 했을 때, 초기 생성분포가 한쪽으로 쏠려 있어도 다른 mode 쪽 positive 들이 drift를 유도하면서 mode collapse를 완화하는 모습을 시각화한다. 또 학습이 진행될수록 생성 분포가 실제로 데이터 분포 쪽으로 옮겨가고, 어느 순간 평형 상태에 가까워지는 모습을 보여준다. 이 그림들은 이 논문이 단순히 숫자 경쟁만 하는 것이 아니라, 정말로 “분포를 이동시키는 관점”을 갖고 있음을 보여준다.&lt;/p&gt;

&lt;p&gt;그리고 정량 실험에서는&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;positive/negative 샘플 수가 늘어날 수록 $\mathbf{V}$ 추정이 더 정확해져 품질이 좋아지고,&lt;/li&gt;
  &lt;li&gt;drifting loss를 계산하는 feature space의 선택이 성능에 큰 영향을 미치며,&lt;/li&gt;
  &lt;li&gt;더 긴 학습과 더 강한 하이퍼파라미터 recipe, 더 큰 모델로 갈수록 FID가 계속 좋아지는 흐름을 보여준다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;특히 표4에서는 baseline 3.36 에서 시작해, 더 긴 학습과 recipe tuning으로 1.75, 더 큰 L/2 모델에서 1.54 까지 내려가는 과정을 보여준다. 여기서 흥미로운 점 하나는, 최종 최고 성능이 CFG scale 1.0, 즉 diffusion 문맥에서는 사실상 “no CFG”에 해당하는 설정에서 나왔다는 것이다. 논문은 이 CFG formulation이 FID와 IS 사이의 trade-off를 보인다고 설명한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;논문이-던지는-가장-좋은-질문&quot;&gt;논문이 던지는 가장 좋은 질문&lt;/h1&gt;

&lt;p&gt;개인적으로 이 논문의 가장 큰 장점은&lt;br /&gt;
“우리는 왜 생성 경로를 추론 시간에만 두고 생각해왔을까?”&lt;br /&gt;
라는 질문을 던진다는 점이다.&lt;/p&gt;

&lt;p&gt;디퓨전과 플로우 매칭은 매우 강력하지만, 결국 추론 시점에 trajectory를 따라가야 한다.&lt;br /&gt;
Drifting Model은 그 trajectory를 학습 과정에 흡수할 수 있다고 주장한다. 그리고 그 아이디어를 추상적인 철학이 아니라,&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;anti-symmetric drifting field&lt;/li&gt;
  &lt;li&gt;stop-gradient fixed-target loss&lt;/li&gt;
  &lt;li&gt;kernelized attraction/repulstion&lt;/li&gt;
  &lt;li&gt;SSL feature-space drifting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이라는 꽤 구체적인 설계로 연결했다.&lt;/p&gt;

&lt;p&gt;물론 논문도 한계를 인정한다.&lt;br /&gt;
평형상태의 역, 즉 $\mathbf{V}=0$ 이 언제 정말 $p=q$ 를 보장하는지는 완전히 일반적인 정리로 끝내지는 못했고, kernel이나 feature encoder의 선택도 아직 최적이라고 보기 어렵다. Feature encoder 없이 ImageNet에서 제대로 작동하지 못했다는 보고 역시, 이 방법이 “아무 공간에서나 통하는 보편적 해답”은 아니라는 점을 보여준다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;마치며&quot;&gt;마치며&lt;/h1&gt;

&lt;p&gt;Drifting Model은 한 문장으로 요약하면 이렇다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;추론 사건의 정제를 학습 시간의 반복으로 밀어 넣고, 생성 샘플이 데이터 분포 쪽으로 스스로 drift 하도록 만드는 모델.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
                <pubDate>Wed, 11 Mar 2026 12:30:00 +0000</pubDate>
                <link>/generative-modeling-via-drifting</link>
                <guid isPermaLink="true">/generative-modeling-via-drifting</guid>
                
                <category>Paper review</category>
                
                <category>Generative model</category>
                
                
            </item>
        
            <item>
                <title>Classifier-Free Diffusion Guidance (NeurIPS 2021)</title>
                <description>&lt;p&gt;“Classifier-Free Diffusion Guidance”는 조건부 생성(conditional generation) Diffusion Model을 개선한 논문입니다. 이 논문이 발표되기 이전, 특정 클래스의 이미지를 생성하도록 모델을 유도하는 일반적인 방법은 별도의 이미지 분류기(Classifier)를 활용하는 ‘Classifier Guidance’였습니다. 이 방식은 효과적이었으나, Diffusion Model 외에 노이즈 낀 이미지를 분류하는 모델을 추가로 학습해야 하는 복잡한 파이프라인이 필요했습니다.&lt;/p&gt;

&lt;p&gt;Jonothan Ho 그리고 Tim Salimans는 이러한 문제를 해결하기 위해 &lt;u&gt;분류기 없이도 동일한 guidance 효과를 얻는 방법을 제안합니다.&lt;/u&gt; 이번 글에서는 이 논문이 제안하는 방법과 그 수학적 원리에 대해 분석을 해보고자 합니다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;기존-classifer-guided-diffusion-model에-대한-문제-제기&quot;&gt;기존 Classifer Guided Diffusion Model에 대한 문제 제기&lt;/h2&gt;

&lt;p&gt;이 논문이 등장하기 전, 디퓨전 모델이 특정 클래스(예: 고양이)의 이미지를 더 잘 생성하도록 만드는 대표적인 방법은 &lt;a href=&quot;https://openreview.net/forum?id=AAWuCvzaVt&quot;&gt;Classifier Guidance&lt;/a&gt;였습니다. 이름 그대로, 잘 훈련된 별도의 이미지 분류기(Classifier)를 가이드로 활용하는 방식이었습니다. 생성 과정 중간에 있는 노이즈 낀 이미지를 분류기에게 보여주고, “이 이미지가 ‘고양이’처럼 보이려면 어느 방향으로 개선해야 할까?”라고 물어보는 것과 같습니다. 분류기는 이미지의 특정 부분을 수정하면 ‘고양이’일 확률이 높아진다고 알려주고, 디퓨전 모델은 이 조언을 참고하여 이미지를 생성합니다.&lt;/p&gt;

&lt;p&gt;이 방법은 효과적이었지만 학습 파이프라인이 복잡하고 학습하기 어렵다고 저자는 지적합니다. 먼저 분류기를 사용하기 위해서는 디퓨전 모델 외에, 노이즈 낀 이미지를 잘 분류하는 분류기를 별도로 학습해야 했습니다. 또한 이 분류기는 깨끗한 이미지가 아닌, 생성 과정 중의 노이즈 낀 이미지를 보고 판단해야 하므로, 일반적인 사전 학습된 분류기를 그대로 사용할 수 없었습니다.&lt;/p&gt;

&lt;p&gt;Classifier-Free Diffusion Guidance는 바로 이 문제를 해결하기 위해 “별도의 분류기 없이 분류기 guidance의 효과를 얻을 수는 없을까?”라는 질문에서 출발합니다. 그리고 이 논문은 디퓨전 모델 자기 자신의 정보를 활용하여 스스로를 안내(guide)하는 아이디어를 제시합니다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;배경지식-diffusion-model-작동-방식&quot;&gt;배경지식: Diffusion Model 작동 방식&lt;/h2&gt;

&lt;p&gt;논문을 이해하기 위해서는 Diffusion Model에 대한 이해가 선행되어야만 합니다. 처음 Denoising Diffusion Probailistic Models (DDPM)에서 소개한 바에 의하면, 2가지 주요 process에 의해 모델이 학습됩니다.&lt;/p&gt;

&lt;h2 id=&quot;1-순방향-프로세스-forward-process-이미지에-노이즈-추가하기&quot;&gt;1. 순방향 프로세스 (Forward Process): 이미지에 노이즈 추가하기&lt;/h2&gt;

&lt;p&gt;디퓨전 모델의 학습은 원본 이미지 $x$에 점진적으로 노이즈를 추가하는 순방향 프로세스에서 시작합니다. 이 과정은 $z_{\lambda}$라는 노이즈가 섞인 이미지를 만들어냅니다. &lt;u&gt;여기서 $\lambda$는 노이즈 레벨을 나타내며, 신호 대 잡음비(Signal-to-Noise Ratio, SNR)의 로그 값으로 해석됩니다. $\lambda$가 작을수록 노이즈가 많고(SNR이 낮음), 클수록 원본에 가깝습니다(SNR이 높음).&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250820_CFDG/forward-process.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;

&lt;p&gt;시간(또는 노이즈 레벨) $\lambda$에서의 노이즈 낀 이미지 $z_{\lambda}$는 다음과 같은 정규분포를 따릅니다.&lt;/p&gt;

\[q(z_{\lambda} \mid x) = \mathcal{N}(\alpha_{\lambda}x, \sigma_{\lambda}^{2}I)\]

&lt;p&gt;여기서 각 항의 의미는 다음과 같습니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;$z_{\lambda}$: 노이즈 레벨 $\lambda$에서의 이미지&lt;/li&gt;
  &lt;li&gt;$x$: 원본 이미지&lt;/li&gt;
  &lt;li&gt;$\alpha_{\lambda}$: 신호(원본 이미지)의 스케일. $\alpha_{\lambda}^{2} = 1 / (1+e^{-\lambda})$로 정의되며, $\lambda$가 커질수록 1에 가까워집니다.&lt;/li&gt;
  &lt;li&gt;$\sigma_{\lambda}$: 노이즈의 스케일. $\sigma_{\lambda}^{2} = 1 - \alpha_{\lambda}^{2}$로 정의되며, $\lambda$가 커질수록 0에 가까워집니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이 식은 $z_{\lambda} = \alpha_{\lambda}x + \sigma_{\lambda}\epsilon$ (단, $\epsilon \sim \mathcal{N}(0, I)$) 형태로 표현할 수 있습니다. 즉, 원본 이미지 $x$의 신호를 약간 줄이고($\alpha_{\lambda}x$) 거기에 표준정규분포 노이즈 $\epsilon$을 더해($\sigma_{\lambda}\epsilon$) 노이즈 낀 이미지 $z_{\lambda}$를 만드는 과정입니다.&lt;/p&gt;

&lt;details&gt;
&lt;summary style=&quot;color: black&quot;&gt;
[참고] 소량의 노이즈를 추가하는 Forward (Diffusion) 과정
&lt;/summary&gt;

Forward process는 마르코프 연쇄(Markov Process)의 성질을 가지며, 현재 상태 $z_\lambda$는 바로 이전 상태 $z_{\lambda&apos;}$에 노이즈를 추가하여 만들어집니다.  
이를 수식으로 표현하면 다음과 같습니다.

먼저, 두 노이즈 레벨 $\lambda$와 $\lambda&apos;$ ($\lambda &amp;lt; \lambda&apos;$)에서 노이즈가 추가된 이미지는 다음과 같이 정의됩니다.

$$
z_\lambda = \alpha_\lambda x + \sigma_\lambda \epsilon,
\qquad
z_{\lambda&apos;} = \alpha_{\lambda&apos;} x + \sigma_{\lambda&apos;} \epsilon
$$

여기서 $\epsilon \sim \mathcal{N}(0, I)$는 동일한 노이즈를 사용합니다. 이제 $z_{\lambda&apos;}$ 식을 $x$에 대해 정리하면, $x = (z_{\lambda&apos;} - \sigma_{\lambda&apos;}\epsilon) / \alpha_{\lambda&apos;}$이 됩니다. 이를 $z_\lambda$ 정의식에 대입하면 다음과 같이 전개됩니다.

$$
\begin{align*}
z_{\lambda}
&amp;amp;= \alpha_{\lambda} \left( \frac{z_{\lambda&apos;} - \sigma_{\lambda&apos;}\epsilon}{\alpha_{\lambda&apos;}} \right) + \sigma_{\lambda}\epsilon \\
&amp;amp;= \frac{\alpha_{\lambda}}{\alpha_{\lambda&apos;}} z_{\lambda&apos;} - \frac{\alpha_{\lambda}\sigma_{\lambda&apos;}}{\alpha_{\lambda&apos;}} \epsilon + \sigma_{\lambda}\epsilon \\
&amp;amp;= \frac{\alpha_{\lambda}}{\alpha_{\lambda&apos;}} z_{\lambda&apos;} + \left( \sigma_{\lambda} - \frac{\alpha_{\lambda}\sigma_{\lambda&apos;}}{\alpha_{\lambda&apos;}} \right) \epsilon.
\end{align*}
$$

논문에서는 항상 분산을 1로 유지하기 위해 다음 관계를 사용합니다: $\sigma^2 = 1 - \alpha^2.$ 이를 이용하면 조건부 분산 $\sigma^2_{\lambda \mid \lambda&apos;}$를 다음과 같이 표현할 수 있습니다.

$$
\begin{align*}
1
&amp;amp;= \left( \frac{\alpha_\lambda}{\alpha_{\lambda&apos;}} \right)^2 \mathrm{Var}(z_{\lambda&apos;}) + \sigma^2_{\lambda \mid \lambda&apos;} \\
\Rightarrow \quad
\sigma^2_{\lambda \mid \lambda&apos;}
&amp;amp;= 1 - \left( \frac{\alpha_\lambda}{\alpha_{\lambda&apos;}} \right)^2 \\
&amp;amp;= \left( 1 - e^{\lambda - \lambda&apos;} \right) \sigma_\lambda^2.
\end{align*}
$$

따라서 Forward process는 다음과 같은 정규분포로 모델링됩니다. (논문 Eq. 2)

$$
q(z_{\lambda} \mid z_{\lambda&apos;}) =
\mathcal{N}\left(
\left( \frac{\alpha_{\lambda}}{\alpha_{\lambda&apos;}} \right) z_{\lambda&apos;},
\ \sigma^2_{\lambda \mid \lambda&apos;} I
\right),
\qquad
\text{where } \lambda &amp;lt; \lambda&apos;, \quad
\sigma^2_{\lambda \mid \lambda&apos;} = \left(1 - e^{\lambda - \lambda&apos;}\right)\sigma^2_{\lambda}.
$$

&lt;br /&gt;

&lt;/details&gt;

&lt;h2 id=&quot;2-역방향-프로세스-reverse-process와-score-based-모델링&quot;&gt;2. 역방향 프로세스 (Reverse Process)와 Score-Based 모델링&lt;/h2&gt;

&lt;p&gt;이미지 생성은 순방향 프로세스의 정반대, 즉 완전한 노이즈 $z_{\lambda_{min}}$에서 시작하여 점차 노이즈를 제거해 원본 이미지 $x$를 복원하는 과정입니다. 이 역방향 프로세스를 모델링하는 것이 디퓨전 모델의 목적입니다.&lt;/p&gt;

&lt;p&gt;모델은 각 단계에서 $z_{\lambda}$가 주어졌을 때, 이전 단계의 이미지 $z_{\lambda’}$ (단, $\lambda &amp;lt; \lambda’$)를 예측해야 합니다. &lt;u&gt;이론적으로 이 예측은 데이터 분포의 score, 즉 로그 밀도 함수의 그래디언트($\nabla_{z_{\lambda}}\log p(z_{\lambda})$)를 추정함으로써 가능합니다.&lt;/u&gt; 이것이 바로 ‘Score-Based’ 모델링의 핵심입니다. 논문에서는 이 score를 직접 추정하는 대신, score와 비례 관계에 있는 노이즈 $\epsilon$을 예측하는 방식을 사용합니다. 둘 사이의 관계는 다음과 같습니다.&lt;/p&gt;

\[\epsilon_{\theta}(z_{\lambda}) \approx - \sigma_{\lambda} \nabla_{z_{\lambda}}\log p(z_{\lambda})\]

&lt;p&gt;여기서 $\epsilon_{\theta}(z_{\lambda})$는 신경망 모델이 예측한 노이즈를 의미합니다. 모델은 훈련 데이터의 실제 노이즈 $\epsilon$과 모델이 예측한 노이즈 $\epsilon_{\theta}(z_{\lambda})$ 사이의 L2 손실을 최소화하도록 학습됩니다.&lt;/p&gt;

\[L = \mathbb{E}_{\epsilon,\lambda}[\| \epsilon_{\theta}(z_{\lambda}) - \epsilon \|_{2}^{2}]\]

&lt;p&gt;따라서, 잘 훈련된 모델 $\epsilon_{\theta}(z_{\lambda})$는 주어진 노이즈 이미지 $z_{\lambda}$에서 원본으로 돌아가기 위해 제거해야 할 노이즈의 방향과 크기에 대한 최적의 추정치를 제공합니다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;제안하는-방법론-proposed-method&quot;&gt;제안하는 방법론 (Proposed Method)&lt;/h2&gt;

&lt;p&gt;이제 본론으로 들어가, Classifier-Free Guidance가 수학적으로 어떻게 구현되는지 살펴보겠습니다. 먼저 비교를 위해 기존의 Classifier Guidance를 수학적으로 이해하고, 이를 바탕으로 Classifier-Free Guidance의 원리를 유도해 보겠습니다.&lt;/p&gt;

&lt;h2 id=&quot;기존-방식-classifier-guidance&quot;&gt;기존 방식, Classifier Guidance&lt;/h2&gt;

&lt;p&gt;Classifier Guidance는 조건부 노이즈 예측기 $\epsilon_{\theta}(z_{\lambda}, c)$의 예측 결과를 별도의 분류기 그래디언트를 이용해 보정합니다. 수정된 노이즈 예측 $\tilde{\epsilon}_{\theta}(z_{\lambda},c)$는 다음과 같이 계산됩니다. (Classifier의 그래디언트를 결합)&lt;/p&gt;

\[\tilde{\epsilon}_{\theta}(z_{\lambda},c) = \epsilon_{\theta}(z_{\lambda},c) - w\sigma_{\lambda}\nabla_{z_{\lambda}}\log p_{\theta}(c \mid z_{\lambda})\]

&lt;p&gt;각 항의 의미는 다음과 같습니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;$\epsilon_{\theta}(z_{\lambda},c)$: 클래스 $c$가 주어졌을 때 디퓨전 모델이 예측한 기본 노이즈&lt;/li&gt;
  &lt;li&gt;$p_{\theta}(c \mid z_{\lambda})$: 파라미터 $\theta$를 갖는 별도의 이미지 분류기&lt;/li&gt;
  &lt;li&gt;$\nabla_{z_{\lambda}}\log p_{\theta}(c \mid z_{\lambda})$: 분류기의 그래디언트 (클래스 $c$에 속하려면 $z_\lambda$를 어떻게 수정해야하는가?)&lt;/li&gt;
  &lt;li&gt;$w$: 가이던스 강도(guidance strength)를 조절하는 하이퍼파라미터&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;결론적으로, 이 수식은 “디퓨전 모델이 제안하는 기본 방향($\epsilon_{\theta}$)에 더해, 분류기가 알려주는 ‘클래스 $c$처럼 보이는’ 방향으로 이미지를 추가로 수정하라”는 의미를 가집니다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;classifier의-그래디언트를-대체하는-방법&quot;&gt;Classifier의 그래디언트를 대체하는 방법?&lt;/h2&gt;

&lt;p&gt;Classifier-Free Guidance의 목표는 분류기의 그래디언트 항($\nabla_{z_{\lambda}}\log p_{\theta}(c \mid z_{\lambda})$)을 분류기 없이 만들어내는 것입니다. 연구진은 베이즈 정리를 이용해 분류기를 ‘암시적(implicit)’으로 나타낼 수 있다고 말합니다. 먼저 익히 잘 알고 있는 조건부 확률에 대한 베이즈 정리는 다음과 같습니다.&lt;/p&gt;

\[p(c\mid z_{\lambda}) = \frac{p(z_{\lambda} \mid c)p(c)}{p(z_{\lambda})}\]

&lt;p&gt;여기서 양변에 로그를 취하면 다음과 같습니다.&lt;/p&gt;

\[\log p(c \mid z_{\lambda}) = \log p(z_{\lambda} \mid c) + \log p(c) - \log p(z_{\lambda})\]

&lt;p&gt;이제 이 식의 그래디언트를 $z_{\lambda}$에 대해 구하면, $p(c)$는 $z_{\lambda}$와 무관하므로 사라집니다.&lt;/p&gt;

\[\nabla_{z_{\lambda}}\log p(c\mid z_{\lambda}) = \nabla_{z_{\lambda}}\log p(z_{\lambda}\mid c) - \nabla_{z_{\lambda}}\log p(z_{\lambda})\]

&lt;p&gt;이것이 바로 암시적 분류기의 그래디언트입니다. 즉, “조건부 데이터 분포의 score”에서 “비조건부 데이터 분포의 score”를 뺀 값입니다. 앞서 배경지식에서 score와 노이즈 예측치 사이의 관계($\nabla_{z_{\lambda}}\log p(z_{\lambda}) \approx -\epsilon(z_{\lambda})/ \sigma_{\lambda}$)를 살펴보았습니다. 이 관계를 위 식의 각 항에 적용하면 다음과 같이 근사할 수 있습니다.&lt;/p&gt;

\[\begin{aligned}
\nabla_{z_{\lambda}}\log p(c \mid z_{\lambda}) &amp;amp;\approx \left(-\frac{\epsilon^{*}(z_{\lambda},c)}{\sigma_{\lambda}}\right) - \left(-\frac{\epsilon^{*}(z_{\lambda})}{\sigma_{\lambda}}\right) \\
&amp;amp;= -\frac{1}{\sigma_{\lambda}} \left( \epsilon^{*}(z_{\lambda},c) - \epsilon^{*}(z_{\lambda}) \right)
\end{aligned}\]

&lt;p&gt;여기서 $\epsilon^{\ast}$는 이론적인 최적의 노이즈 예측을 의미합니다. &lt;u&gt;이 결과는 별도의 분류기 없이, 디퓨전 모델이 학습하는 두 종류의 노이즈 예측치(조건부 예측 $\epsilon^{\ast}(z_{\lambda},c)$와 비조건부 예측 $\epsilon^{\ast}(z_{\lambda})$)의 차이만으로 분류기 그래디언트와 유사한 항을 만들어낼 수 있음을 보여줍니다.&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;새로운-방식-classifier-free-guidance&quot;&gt;새로운 방식, Classifier-Free Guidance&lt;/h2&gt;

&lt;p&gt;이제 위에서 유도한 암시적 분류기 그래디언트를 원래의 Classifier Guidance 수식에 대입해 보겠습니다.&lt;/p&gt;

&lt;p&gt;원래 수식:&lt;/p&gt;

\[\tilde{\epsilon}_{\theta} = \epsilon_{\theta}(c) - w\sigma_{\lambda}\nabla_{z_{\lambda}}\log p
(c \mid z_{\lambda})\]

&lt;p&gt;유도한 항 대입:&lt;/p&gt;

\[\begin{aligned}
\tilde{\epsilon}^{*}(z_{\lambda},c) &amp;amp;= \epsilon^{*}(z_{\lambda},c) - w\sigma_{\lambda} \left( -\frac{1}{\sigma_{\lambda}} \left( \epsilon^{*}(z_{\lambda},c) - \epsilon^{*}(z_{\lambda}) \right) \right) \\
&amp;amp;= \epsilon^{*}(z_{\lambda},c) + w \left( \epsilon^{*}(z_{\lambda},c) - \epsilon^{*}(z_{\lambda}) \right) \\
&amp;amp;= (1+w)\epsilon^{*}(z_{\lambda},c) - w\epsilon^{*}(z_{\lambda})
\end{aligned}\]

&lt;p&gt;이론적인 최적의 예측 $\epsilon^*$ 대신, 우리가 훈련시킨 신경망 모델의 예측 $\epsilon_{\theta}$를 사용하면 최종적인 Classifier-Free Guidance 수식이 완성됩니다.&lt;/p&gt;

\[\tilde{\epsilon}_{\theta}(z_{\lambda},c) = (1+w)\epsilon_{\theta}(z_{\lambda},c) - w\epsilon_{\theta}(z_{\lambda})\]

&lt;p&gt;이 수식은 “비조건부 예측치($\epsilon_{\theta}(z_{\lambda})$)를 기준점으로 삼아, 조건부 예측치($\epsilon_{\theta}(z_{\lambda},c)$) 방향으로 $w$만큼 더 나아가라”는 매우 직관적인 의미를 가집니다. 학습 과정에서는 일정 확률($p=0.2$)로 조건($c$)을 누락시켜 하나의 모델이 $\epsilon_{\theta}(z_{\lambda},c)$와 $\epsilon_{\theta}(z_{\lambda})$를 모두 예측할 수 있도록 학습합니다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;실험-및-결과&quot;&gt;실험 및 결과&lt;/h2&gt;

&lt;p&gt;연구진은 제안한 방법의 효과를 검증하기 위해 대규모 이미지 데이터셋인 ImageNet에서 실험을 진행했습니다. 이미지 품질을 평가하기 위해 두 가지 대표적인 지표를 사용했습니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;FID (Fréchet Inception Distance): 생성된 이미지와 실제 이미지의 분포가 얼마나 유사한지를 측정합니다. (낮을수록 좋음)&lt;/li&gt;
  &lt;li&gt;IS (Inception Score): 생성된 이미지가 얼마나 선명하고 특정 사물로 인식될 수 있는지, 그리고 얼마나 다양한 클래스의 이미지를 생성하는지를 측정합니다. (높을수록 좋음)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이 두 지표는 보통 하나가 좋아지면 다른 하나가 나빠지는 트레이드오프(trade-off) 관계를 가집니다. 예를 들어, 매우 똑같이 생긴 고품질 허스키 이미지만 계속 생성한다면 FID는 낮아지겠지만 다양성이 부족해져 IS도 낮아질 수 있습니다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250820_CFDG/figure1.png&quot; alt=&quot;Figure 1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;가이던스 강도(w)에 따른 변화&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;w&lt;/code&gt;를 0에서 점차 높이면, IS는 꾸준히 증가하여 이미지의 선명도와 클래스 정체성이 강화되는 것을 볼 수 있습니다. 반면 FID는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;w&lt;/code&gt;가 0.3일 때 2.43으로 가장 낮은 값(가장 좋은 품질)을 기록한 후, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;w&lt;/code&gt;가 더 커지자 다시 증가하는 경향을 보입니다.&lt;/p&gt;

&lt;p&gt;이는 적절한 수준의 가이던스는 이미지의 사실적인 품질(FID)을 크게 향상시키지만, 과도한 가이던스는 오히려 다양성을 해치고 특정 클래스의 특징만 과장하여 부자연스러운 이미지(높은 FID)를 만들 수 있음을 보여줍니다. 사용자는 이 트레이드오프를 이해하고 목적에 맞게 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;w&lt;/code&gt; 값을 조절할 수 있습니다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250820_CFDG/table2.png&quot; alt=&quot;Table 2&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;결론&quot;&gt;결론&lt;/h3&gt;

&lt;p&gt;Classifier-Free Diffusion Guidance는 디퓨전 모델의 품질과 제어를 별도의 분류기 없이도 가능하다는 것을 증명해낸 논문입니다. 기존 Classifier가 주는 확률 분포식을 베이즈 정리를 통해 풀어내어 조건부 디퓨전 그리고 비조건부 디퓨전 결과의 결합으로 동일한 결과를 얻어낼 수 있음을 보였습니다.&lt;/p&gt;

&lt;p&gt;하지만 논문에서 언급한 한 가지 단점은 샘플링 속도입니다. 매 단계마다 조건부, 비조건부 예측을 위해 모델을 두 번 실행해야 하므로, 가이던스가 없을 때보다 시간이 더 오래 걸립니다. 연구진은 향후 모델 아키텍처 변경 등을 통해 이 문제를 완화할 수 있을 것이라고 제안했습니다.&lt;/p&gt;
</description>
                <pubDate>Wed, 20 Aug 2025 12:00:00 +0000</pubDate>
                <link>/classifier-free-diffusion-guidance</link>
                <guid isPermaLink="true">/classifier-free-diffusion-guidance</guid>
                
                <category>Paper review</category>
                
                <category>Diffusion</category>
                
                <category>Generative model</category>
                
                
            </item>
        
            <item>
                <title>Denoising Diffusion Probabilistic Models (NeurIPS 2020)</title>
                <description>&lt;p&gt;2020년 발표된 “Denoising Diffusion Probabilistic Models” (DDPM)은 생성 모델 연구에 중요한 전환점을 제시한 논문입니다. 당시 Generative Adversarial Networks (GANs)는 훈련 불안정성과 모드 붕괴(mode collapse)와 같은 문제점에도 불구하고 높은 성능으로 인해 고품질 이미지 생성 분야에서 널리 사용되고 있었습니다. DDPM은 이러한 상황 속에서 Diffusion Model이라는 새로운 패러다임의 잠재력을 증명하며 후속 연구의 증가를 이끌어냈습니다.&lt;/p&gt;

&lt;p&gt;DDPM 이전에도 Diffusion Model에 대한 아이디어는 있었지만, Variational Lower Bound (ELBO)를 최적화해야 하는 복잡한 학습 과정과 만족스럽지 못한 성능 때문에 주요 연구 흐름에서는 크게 주목받지 못했습니다. 하지만 Ho et al. (2020)의 &lt;u&gt;DDPM은 모델 구조와 학습 목표(objective)에 대한 새로운 설계를 통해, Diffusion Model이 GAN에 필적하거나 이를 능가하는 고품질 이미지 생성이 가능함을 입증했습니다.&lt;/u&gt; 본 글에서는 DDPM의 방법론을 분석하고, 논문의 수식 전개 과정을 짚어보고자 합니다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;노이즈-확산과-복원-과정&quot;&gt;노이즈 확산과 복원 과정&lt;/h2&gt;

&lt;p&gt;DDPM은 두 가지 마르코프 연쇄(Markov Chain) 과정에 기반합니다. 하나는 원본 데이터를 점진적으로 파괴하는 정방향 과정 (Forward Process)이고, 다른 하나는 파괴된 상태에서 원본을 복원하도록 학습하는 역방향 과정 (Reverse Process) 입니다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;images/20250815_DDPM/figure2.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;정방향 과정 (Forward Process)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;정방향 과정은 원본 데이터 $x_0$에 $T$ 타임스텝에 걸쳐 점진적으로 가우시안 노이즈를 추가하여, 최종적으로는 아무런 정보도 없는 순수 가우시안 노이즈 $x_T$로 변환하는 과정입니다. 이 과정은 모델이 학습하는 것이 아닌, 미리 정해진 규칙에 따라 진행되는 고정된 프로세스입니다. 각 단계 $t$에서의 변환은 다음과 같이 정의됩니다. (논문 Eq. 2)&lt;/p&gt;

\[q(x_t \mid x_{t-1}) = \mathcal{N}(x_t ; \sqrt{1 - \beta_t} x_{t-1}, \beta_t \mathbf{I})\]

&lt;p&gt;여기서 $\beta_t$는 $t$스텝에서 추가할 노이즈의 양을 조절하는 분산 스케줄(variance schedule)로, 미리 정의된 하이퍼파라미터입니다. DDPM에서는 $10^{-4}$에서 $0.02$까지 선형적으로 증가하는 스케줄을 사용했습니다. 즉, 초기 단계에서는 데이터의 구조를 거의 해치지 않는 작은 노이즈를 추가하고, 후반으로 갈수록 더 강한 노이즈를 주입하여 최종적으로 $x_T$가 $x_0$의 정보를 거의 잃은 표준 정규분포에 가까워지도록 합니다.&lt;/p&gt;

&lt;p&gt;이 과정의 중요한 속성은, 매 스텝을 순차적으로 거치지 않고도 원본 $x_0$만 있다면 임의의 타임스텝 $t$의 노이즈 낀 데이터 $x_t$를 한 번에 얻을 수 있다는 점입니다. $\alpha_t = 1 - \beta_t$ 이고, $\bar{\alpha}_t = \prod_{s=1}^T \alpha_s$라고 정의하면, 재매개변수화 트릭(reparameterization trick)을 통해 $x_t$는 다음의 닫힌 형식(closed-form)으로 표현됩니다. (논문 Eq. 4)&lt;/p&gt;

\[x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, \quad \text{where} \; \epsilon \sim \mathcal{N}(\mathbf{0, I})\]

&lt;p&gt;따라서 $q(x_t \mid x_0)$의 분포는 다음과 같습니다.&lt;/p&gt;

\[q(x_t \mid x_0) = \mathcal{N}(x_t ; \sqrt{\bar{\alpha}_t} x_0, (1-\bar{\alpha}_t) \mathbf{I})\]

&lt;p&gt;이 덕분에 모델 학습 시 전체 $T$ 스텝을 모두 시뮬레이션할 필요가 없습니다. 미니배치에서 뽑은 원본 이미지 $x_0$와 무작위로 고른 타임스텝 $t$만으로, 모델에 입력할 노이즈 데이터를 즉시 생성할 수 있습니다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;역방향 과정 (Reverse Process)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;역방향 과정은 순수 노이즈 $x_T \sim \mathcal{N}(\mathbf{0}, \mathbf{I})$에서 출발해, 정방향 과정을 거꾸로 따라가며 원본 데이터 분포의 샘플 $x_0$를 복원하는 것을 목표로 합니다. 이 과정은 신경망으로 모델링된 학습 가능한(learnable) 마르코프 연쇄입니다. (논문 Eq. 1)&lt;/p&gt;

\[p_\theta (x_{t-1} \mid x_t) = \mathcal{N}(x_{t-1} ; \mu_\theta (x_t, t), \Sigma_\theta (x_t, t))\]

&lt;p&gt;모델은 각 스텝 $t$에서 노이즈 낀 데이터 $x_t$를 입력받아, 이전 스텝 $x_{t-1}$의 분포를 결정하는 평균 $\mu_\theta$와 공분산 $\Sigma_\theta$를 예측하도록 학습됩니다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250815_DDPM/reverse_drarw.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;

&lt;details&gt;
    &lt;summary&gt; 모델은 무엇을 보고 $\mu_\theta$를 예측해야 할까? &lt;/summary&gt;

&lt;br /&gt;

이상적인 목표는 정방향 과정의 실제 사후 확률 분포인 $q(x_{t-1} \mid x_t)$를 근사하는 것입니다. 하지만 이 분포를 계산하려면 $q(x_{t-1} \mid x_t) = \int q(x_{t-1} \mid x_t, x_0) q(x_0) d x_0$와 같이 전체 데이터 분포 $q(x_0)$에 대한 적분이 필요하므로 다루기 어렵습니다. 여기서 DDPM은 중요한 트릭을 사용하였습니다. 만약 원본 데이터 $x_0$가 조건으로 주어진다면, 이 사후 확률은 베이즈 정리에 의해 다루기 쉬운 형태로 유도될 수 있습니다. (논문 Eq. 6)

$$ q(x_{t-1} \mid x_t, x_0) = \mathcal{N}(x_{t-1} ; \tilde{\mu}_t (x_t, x_0), \tilde{\beta}_t I) $$

이 분포의 평균 $\tilde{\mu}_t$와 분산 $\beta_t$는 어떻게 유도가 될지, 논문에서는 생략된 이 과정을 살펴보겠습니다.

&lt;h3&gt; 역방향 사후 확률 $q(x_{t-1} \mid x_t, x_0)$ 의 유도 &lt;/h3&gt;

베이즈 정리에 따라 $q(x_{t-1} \mid x_t, x_0)$는 다음과 같이 전개됩니다.

$$ q(x_{t-1} \mid x_t, x_0) = q(x_t \mid x_{t-1}, x_0) \frac{q(x_{t-1} \mid x_0)}{q(x_t \mid x_0)} $$

정방향 과정의 마르코프 성질에 의해 $q(x_t \mid x_{t-1}, x_0) = q(x_t \mid x_{t-1})$ 이므로, 각 항은 우리가 이미 알고 있는 가우시안 분포의 확률 밀도 함수(PDF)입니다. 가우시안 분포의 PDF는 $\exp$ 항으로 표현되므로, 이 식은 다음과 같이 지수부의 연산으로 변환됩니다.

$$
\propto \exp \left( -\frac{1}{2} \left ( \frac{(x_t - \sqrt{\alpha_t} x_{t-1})^2}{\beta_t} + \frac{(x_{t-1} - \sqrt{\bar{\alpha}_{t-1}} x_0)^2}{1 - \bar{\alpha}_{t-1}} - \frac{(x_t - \sqrt{\bar{\alpha}_t}x_0)^2}{1-\bar{\alpha}_t} \right) \right)
$$

이 복잡한 지수부의 식을 $x_{t-1}$에 대한 이차식으로 정리하면, $x_{t-1}$이 따르는 새로운 가우시안 분포의 평균과 분산을 얻어낼 수 있습니다. 정리하게 되면, 분산 $\tilde{\beta}_t$와 평균 $\tilde{\mu}_t$는 다음과 같이 유도됩니다. (논문 Eq. 7)

$$
\tilde{\beta}_t = \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \beta_t
$$

$$
\tilde{\mu}_t(x_t, x_0) = \frac{\sqrt{\bar{\alpha}_{t-1}}\beta_t}{1 - \bar{\alpha}_t} x_0 + \frac{\sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_t
$$

이제 우리는 모델이 근사해야 하는 명확한 목표 $\tilde{\mu}_t$를 계산했습니다. 하지만 이 식은 여전히 학습 목표로 삼기에는 복잡하고, 결정적으로 학습 시점에는 알 수 없는 $x_0$를 포함합니다. 이 문제를 해결하기 위해 DDPM은 다시 한 번 목적 함수를 재설계합니다.

&lt;/details&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;예측-목표의-전환-평균에서-노이즈로&quot;&gt;예측 목표의 전환, 평균에서 노이즈로&lt;/h2&gt;

&lt;p&gt;DDPM의 기여 중 하나는 역방향 과정의 평균 $\mu_\theta$를 직접 예측하는 대신, 해당 스텝에서 추가된 노이즈만을 예측하도록 목표를 재매개변수화하고, 이에 맞춰 학습 목적 함수를 단순화한 것입니다.&lt;/p&gt;

&lt;p&gt;앞서 유도한 $\tilde{\mu}_t$의 식을 다시 살펴보겠습니다. 여기에 정방향 과정의 속성인 $x_0 = \frac{1}{\sqrt{\bar{\alpha}_t}}(x_t - \sqrt{1-\bar{\alpha}_t} \epsilon)$을 대입하여 $x_0$를 소거하고 $x_t$와 $\epsilon$에 대한 식으로 정리하면, 다음과 같은 간결한 형태로 정리됩니다.&lt;/p&gt;

\[\tilde{\mu}_t(x_t, x_0) = \frac{1}{\sqrt{\alpha}_t} \left(x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon \right)\]

&lt;p&gt;이 식은 매우 중요한 사실을 내포합니다. 우리가 찾아야 할 이상적인 평균 $\tilde{\mu}_t$는 결국 $x_t$와 $\epsilon$의 선형 결합이라는 것입니다. $x_t$는 모델의 입력값이므로, 평균을 예측하는 문제는 곧 노이즈 $\epsilon$을 예측하는 문제와 동치가 됩니다. 즉, &lt;u&gt;학습 목표가 ‘이전 스텝의 깨끗한 이미지 평균’ 같은 복잡하고 추상적인 대상에서, ‘현재 이미지에 추가된 노이즈’라는 더 단순하고 직관적인 대상으로 바뀐 것입니다.&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;이 발견에 기반하여 저자들은 $\epsilon_\theta(x_t, t)$가 실제 노이즈 $\epsilon$을 예측하도록 설계합니다. 그리고 이를 이용해 모델이 예측할 평균 $\mu_\theta$를 다음과 같이 재구성합니다. (논문 Eq. 11)&lt;/p&gt;

\[\mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon_\theta(x_t, t) \right)\]

&lt;p&gt;이러한 재매개변수화는 Variational Lower Bound (ELBO)를 크게 단순화하는 효과를 가져옵니다. 복잡한 KL Divergence 항들이 정리되어, 최종적으로 다음과 같은 매우 직관적이고 간단한 형태의 목적 함수가 제안됩니다. (논문 Eq. 14)&lt;/p&gt;

\[L_{simple}(\theta) := \mathbb{E}_{t, x_0, \epsilon} \left[ \| \epsilon - \epsilon_\theta (\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, t) \|^2 \right]\]

&lt;p&gt;이 목적 함수는 “(1) 원본 이미지 $x_0$와 랜덤 타임스텝 $t$를 고르고, 해당 스텝의 노이즈 낀 이미지 $x_t$를 만든다. (2) 모델 $\epsilon_\theta$가 $x_t$와 $t$를 보고 우리가 주입한 실제 노이즈 $\epsilon$을 얼마나 잘 맞추는지 L2 Loss로 측정한다”는 직관적인 의미를 갖습니다. 이 단순화된 목적 함수는 DDPM의 성공에 결정적인 역할을 하였습니다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;실험-결과-및-평가&quot;&gt;실험 결과 및 평가&lt;/h2&gt;

&lt;p&gt;DDPM은 CIFAR-10, LSUN, CelebA-HQ 등 다양한 데이터셋에서 당시 SOTA 생성 모델들과의 성능을 비교했습니다. 특히 Unconditional CIFAR-10 데이터셋에서 Inception Score 9.46, FID 3.17을 달성하며, 당시 최고 수준의 GAN 모델들과 대등하거나 우월한 성능을 보였습니다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250815_DDPM/figure1.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;

&lt;p&gt;이는 Diffusion Model이 고품질 이미지 생성에 매우 효과적인 inductive bias를 가지고 있음을 시사합니다. &lt;u&gt;다만, 샘플링 과정에서 수천 번의 순차적인 네트워크 연산이 필요하여 GAN에 비해 샘플링 속도가 현저히 느리다는 단점이 지적되었습니다.&lt;/u&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;결론&quot;&gt;결론&lt;/h2&gt;

&lt;p&gt;DDPM은 다루기 어려웠던 역방향 과정의 사후 확률($q$)이라는 이론적 목표를, ‘노이즈 예측’이라는 직관적인 문제로 재정의하고, 이를 효과적으로 학습할 수 있는 단순화된 목적 함수를 제안함으로써 Diffusion Model의 잠재력을 크게 향상시킨 중요한 연구입니다. 이 논문이 제시한 명확한 프레임워크와 성능은 이후 샘플링 속도 개선(DDIM), 조건부 생성, 텍스트-이미지 변환 등 수많은 후속 연구의 토대가 되었으며, 오늘날에도 생성 AI 발전에 크게 기여한 핵심 논문으로 평가됩니다.&lt;/p&gt;
</description>
                <pubDate>Thu, 14 Aug 2025 17:00:00 +0000</pubDate>
                <link>/denoising-diffusion-probablistic-models</link>
                <guid isPermaLink="true">/denoising-diffusion-probablistic-models</guid>
                
                <category>Paper review</category>
                
                <category>Diffusion</category>
                
                <category>Generative model</category>
                
                
            </item>
        
            <item>
                <title>Poles, Zeros, and Stability: The Z-Transform in Action</title>
                <description>&lt;p&gt;The $z$-transform is one of the most important mathematical tools in signal processing and system analysis. Through a series of fundamental questions, this post will guide you through its concepts, properties, and other applications.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;z-transform&quot;&gt;Z-transform&lt;/h2&gt;

&lt;p&gt;Let’s begin with the first question. “What is the $z$-transform, and why do we need it?”. The $z$-transform is a mathematical tool for analyzing discrete-time signals and systems. It &lt;u&gt;extends the Discrete-Time Fourier Transform (DTFT) by introducing a scaling factor $r$, which helps with stability and convergence&lt;/u&gt;. The $z$-transform is essential for LTI system analysis, stability checking, filter design, and difference equation solutions.&lt;/p&gt;

&lt;p&gt;The $z$-transform of a discrete-time signal $x[n]$ is give by:&lt;/p&gt;

\[X(z)=\sum_{n=-\infty}^{\infty} x[n]z^{-n} \quad \text{where} \; z=re^{j\omega}\]

&lt;p&gt;Why does the equation look like that? The term $e^{-j\omega n}$ is used in Fourier analysis to represent frequency components. The additional scaling factor $r^{-n}$ controls the growth/decay of signals and ensures convergence. So we can make an analysis even if the input signal is not making convergence.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250207_ZTRANSFORM/figure1.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;region-of-convergence&quot;&gt;Region of convergence&lt;/h3&gt;

&lt;p&gt;Then what value is to be set for $r$? The concept of Region of Convergence (ROC) emerges from this question. The ROC is the set of $z$-values where the Z-transform converges. It determines whether the system exists, and it plays a key role in stability analysis. For stability, the ROC must include the unit circle $\vert z \vert = 1$. We’ll see why below.&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250207_ZTRANSFORM/figure2.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;Region of convergence on different signals&lt;/em&gt;
&lt;/div&gt;

&lt;p&gt;If we set $r = 1$, the $z$-transform reduces to the Discrete-Time Fourier Transform (DTFT).&lt;/p&gt;

\[X(\Omega)=\sum_{n = -\infty} ^{\infty} x[n]e^{-j\Omega n}\]

&lt;p&gt;The key insight is that the Fourier transform analyzes frequency components, while the $z$-transform generalizes it by adding a scaling factor $r^{-n}$. If the ROC includes the unit circle, evaluating $X(z)$ at $z=e^{j\omega}$ gives the frequency response. Thus, the $z$-transform is a superset of the Fourier transform.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;poles-and-zeros&quot;&gt;Poles and zeros&lt;/h3&gt;

&lt;p&gt;By the way, how do we check if a system is stable using the $z$-transform? We usually determine &lt;u&gt;BIBO stability&lt;/u&gt;. BIBO means Bounded Input and Bouded Output. A discrete-time system is BIBO stable if the following equation satisfies:&lt;/p&gt;

\[\sum_{n=-\infty}^{\infty} |h[n]| &amp;lt; \infty.\]

&lt;p&gt;To satisfy the equation above, the ROC must include the unit circle on $z$-plane. Also, we can determine the stability using the concept of ‘pole’. The poles of a system are the values of $z$ where $H(z)$ goes to infinity (denominator = 0). If all poles lie inside of unit circle, then we say system is stable on bounded input signal. &lt;strong&gt;Note that, we can only determine the system is stable or not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The other concept that goes with ‘pole’ is ‘zeros’. Zeros are values of $z$ where $H(z)$ becomes zero (numerator = 0). Generally, poles are marked with ‘x’ in the $z$-plane and zeros are marked with ‘o’ in the $z$-plane. Poles determine stability, while zereos determine which frequencies are canceled.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250207_ZTRANSFORM/figure3.png&quot; alt=&quot;alt text&quot; class=&quot;centered&quot; width=&quot;80%&quot; /&gt;
&lt;em&gt;Poles and zeros plotted on $z$-plane with sample response&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At zero, the system completely cancels the corresponding frequency component. For example, if a system has a zero at z = $e^{j \pi / 4}$, it completely removes any signal component at $\omega = \pi / 4$. This is how notch filters work!&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;convolution-property-of-z-transfrom&quot;&gt;Convolution property of $z$-transfrom&lt;/h3&gt;

&lt;p&gt;Convolution in the time domain is multiplication in the $z$-domain, just like in Fourier analysis. This makes system analysis much easier.&lt;/p&gt;

\[x[n]*h[n]=X(\Omega) H(\Omega)=X(z)H(z)\]

&lt;hr /&gt;

&lt;h3 id=&quot;relationship-between-the-z-transform-and-difference-equation&quot;&gt;Relationship between the $z$-transform and difference equation&lt;/h3&gt;

&lt;p&gt;As we’ve seen &lt;a href=&quot;/understanding-lti-systems&quot;&gt;here&lt;/a&gt; a discrete-time linear time-invariant (LTI) system is often described using a difference equation, which relates the system’s output $y[n]$ to its input $x[n]$:&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

\[y[n]-\sum_{p=1}^{N}a_py[n-p] = \sum_{q=0}^{M} b_q x[n-q]\]

&lt;ul&gt;
  &lt;li&gt;$x[n]$: discrete-time input signal&lt;/li&gt;
  &lt;li&gt;$y[n]$: output signal&lt;/li&gt;
  &lt;li&gt;$a_k$: Feedback coefficients (related to system memory)&lt;/li&gt;
  &lt;li&gt;$b_k$: Feedforward coefficients (how the input affects output)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;This equation completely defines the system’s behavior and is fundamental in digital signal processing. The $z$-transform allows us to convert this time-domain equation into an algebraic equation in the $z$-domain, making it much easier to analyze.&lt;/p&gt;

\[Y(z)-a_1z^{-1}Y(z)-a_2z^{-2}Y(z)-\cdots -a_Nz^{-N}Y(z) \\
\quad = (b_0 + b_1z^{-1}+\cdots +b_Mz^{-M})X(z)\]

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;If we factor $Y(z)$ and rearrange the equation it will be:&lt;/p&gt;

\[H(z)=\frac{Y(z)}{X(z)} = \frac{b_0+b_1z^{-1}+\cdots+b_Mz^{-M}}{1-a_1z^{-1}-a_2z^{-2}-\cdots -a_Nz^{-N}}\]

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Here, the denominator $X(z)$ comes form the left-hand side of the difference equation (the feedback part). Poles are the roots of $X(z)$, which define the system’s natural response (stability, transient behavior). On the other hand, the numerator $Y(z)$ comes from the right-hand side of the difference equation (the input reesponse). Zeros are the roots of $Y(z)$, which define how the system modifies the input.&lt;/p&gt;

&lt;p&gt;So, whay I want to say here, the $z$-transform and the difference equation are deeply connected! The $z$-transform simplifies difference equations into an algebraic form, allowing us to easily analyze system behavior using poles and zeros.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;The $z$-transform generalizes the Fourier Transform, making it a powerful tool for analysing discrete-time systems. It helps determine stability, system response, and frequency filtering with ease. Checking pole locations in the $z$-plane tells us everything about a system’s stability and behavior.&lt;/p&gt;
</description>
                <pubDate>Sat, 08 Feb 2025 07:41:20 +0000</pubDate>
                <link>/z-transfrom</link>
                <guid isPermaLink="true">/z-transfrom</guid>
                
                <category>Signal Processing</category>
                
                
            </item>
        
            <item>
                <title>Discrete Fourier Transform and Fast Fourier Transform</title>
                <description>&lt;p&gt;우리는 일상에서 다양한 형태의 신호를 접한다. 음악, 음성, 이미지 등은 모두 신호의 한 형태이며, 이를 효과적으로 분석하고 처리하기 위해서는 신호를 시간 영역뿐만 아니라 주파수 영역에서도 바라볼 필요가 있다. 주파수 영역에서 신호를 해석하면 내재된 패턴을 더욱 명확하게 분석할 수 있으며 필터링, 압축, 특성 추출과 같은 여러 신호 처리 기법을 적용할 수 있게된다.&lt;/p&gt;

&lt;p&gt;그러나 컴퓨터에서 이 모든 과정을 처리하기 위해서는 시간 영역과 주파수 영역의 신호 모두 이산적인 값을 가져야 한다. 이 과정에서 주어진 이산 신호를 주파수 영역에서 분석하려면 이산 푸리에 변환(DFT)이 필요하다. 더 나아가, 연산량을 줄여 효율적으로 변환하는 방법인 고속 푸리에 변환(FFT)이 요구된다. 이번 글에서는 DFT가 무엇인지 그리고 FFT를 통해 연산량을 어떻게 줄였는지 살펴보려고 한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;discrete-fourier-transform&quot;&gt;Discrete Fourier Transform&lt;/h2&gt;

&lt;p&gt;일반적인 푸리에 변환은 신호를 시간 영역에서 주파수 영역으로 변환하는 도구이다. 그러나 우리가 다루는 대부분의 신호는 디지털 신호이고, 이산적인 값들로만 표현된다. 문제는 이러한 이산 신호를 변환하더라도 주파수 영역에서는 여전히 연속적인 값을 갖는다는 점이다. 이를 해결하기 위해 등장한 것이 이산 푸리에 변환이다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250206_DFT/figure1.png&quot; alt=&quot;DTFT 예시&quot; /&gt;
&lt;em&gt;An example of discret-time Fourier transform (DTFT)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;이산 신호의 주파수 변환을 수행할 때, 주파수 영역의 값도 연속적이라면 데이터를 완벽하게 분석할 수 없다. 하지만, 입력 신호가 주기성을 갖는다면 주파수 영역에서도 이산적인 값들만 존재한다. 즉, 주파수 영역에서도 특정 구간을 등간격으로 샘플링하게 되면, 유한 개의 값으로 주파수 정보를 표현해 낼 수 있다.&lt;/p&gt;

&lt;p&gt;DFT는 이러한 개념을 기반으로 신호를 주파수 영역에서 고정된 개수의 점으로 샘플링하여 표현한다. 수식으로 DFT를 표현하면 다음과 같다:&lt;/p&gt;

\[X(\Omega)=\mathscr{F} \{ x[n] \}=\sum_{n=0}^{N-1} x[n] e^{-j\Omega n}\]

\[X_M(\Omega)=X(k\Delta\Omega)=\sum_{n=0}^{N-1} x[n] e^{-j\frac{2\pi}{M}k n}, \quad k=0, 1, \dots, N-1\]

&lt;p&gt;주파수를 등간격으로 샘플링한다고 했는데, 몇 개의 값으로 샘플링해야할지 생각해봐야 한다. &lt;u&gt;주어진 신호가 길이 $N$이라면, DFT에서는 정확히 $N$개의 주파수 성분을 계산하게 된다.&lt;/u&gt; 그 이유는, 주어진 신호가 길이 $N$일 때 시간 영역의 표본 수가 $N$개 이므로, 주파수 영역에서도 동일한 개수의 정보를 유지하기 때문이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;twiddle-factor&quot;&gt;Twiddle factor&lt;/h3&gt;

&lt;p&gt;DFT의 핵심 개념 중 하나는 회전 인자(twiddle factor)이다. 이는 복소 평면에서 주파수 성분을 나타내는 요소로, 특정 주파수 성분을 계산할 때 회전하는 패턴을 갖는다. 회전인자는 다음과 같이 정의된다:&lt;/p&gt;

\[W_N^{kn} =e^{-j\frac{2\pi}{N}kn}\]

&lt;p&gt;이 회전 인자는 복소평면에서 $N$개의 점을 균등하게 나누어 배치한 형태로 볼 수 있으며, DFT 연산을 단순화하는 역할을 한다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250206_DFT/figure2.png&quot; alt=&quot;alt text&quot; class=&quot;centered&quot; width=&quot;50%&quot; /&gt;
&lt;em&gt;twiddle factor&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;resolution&quot;&gt;Resolution&lt;/h3&gt;

&lt;p&gt;DFT를 통해 얻어진 주파수 성분들의 간격은 해상도(resolution)라고 하며, 이는 신호 속에 존재하는 주파수 성분을 얼마나 정밀하게 분석할 수 있는지를 나타낸다. DFT의 해상도는 다음과 같이 정의된다:&lt;/p&gt;

\[\Delta F = \frac{1}{N} \quad \text{or} \quad \Delta \Omega=\frac{2\pi}{N}\]

&lt;p&gt;조금 전 수식을 보면, DFT를 적용했을 때 twiddle factor의 배수에 해당하는 주파수 성분들만 검출하게 된다. 그 주파수 성분들을 더욱 세밀하게 검출하다보면 원래 신호가 가지고 있던 모든 주파수 성분들을 찾아낼 것이다. 즉, 분석할 수 있는 주파수 간격은 신호의 길이 $N$이 길수록 더욱 세밀해진다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250206_DFT/figure3.png&quot; alt=&quot;alt text&quot; class=&quot;centered&quot; width=&quot;80%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;하지만, 만약 아날로그 신호 $x(t)$에서 디지털 신호 $x[n]$으로 변환할 때 충분한 샘플을 획득하지 못해 적은 $N$이 선정되었다면, 해상도를 높이기 위해 zero-padding을 추가해볼 수 있다. Zero-padding을 추가하면 더욱 세밀하게 주파수 대역을 살펴볼 수 있어 어느정도 보간의 효과를 줄 수 있다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;circular-convolution&quot;&gt;Circular convolution&lt;/h3&gt;

&lt;p&gt;DFT에서는 신호가 주기적으로 반복된다고 가정하기 대문에, 일반적인 컨볼루션을 그대로 적용하면 왜곡이 발생할 수 있다. 이를 해결하기 위해 등장한 개념이 원형 컨볼루션(Circular convolution)이다.  &lt;u&gt;주기신호를 사용해 기존의 선형 컨볼루션을 적용하게 되면 값이 발산할 수도 있는 문제를 해결&lt;/u&gt;한다.&lt;/p&gt;

\[y[n]=\sum_{m=0}^{N-1} x[m]h[n-m]=x[n] \circledast h[n]\]

&lt;p&gt;원형 컨볼루션은 주기가 같은 신호에서만 진행이되며, 이를 시각화해서 나타내면 동심원을 통한 계산으로 볼 수 있다. 원형 컨볼루션은 일반적인 컨볼루션과 달리, 신호가 한 주기를 기준으로 회전하며 연산이 수행된다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250206_DFT/figure4.png&quot; alt=&quot;alt text&quot; class=&quot;centered&quot; /&gt;
&lt;em&gt;circular convolution&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;fast-fourier-transform&quot;&gt;Fast Fourier Transform&lt;/h2&gt;

&lt;p&gt;DFT는 이산 시간 신호를 이산 주파수 영역에서 해석할 수 있는 강력한 변환도구 이지만, 연산량이 $\mathcal{O}(N^2)$ 만큼 요구된다는 단점이 있다. 신호의 길이가 길어질수록 계산 비용이 기하급수적으로 증가하기 때문에, 이를 효율적으로 계산하는 방법이 필요하다.&lt;/p&gt;

&lt;p&gt;FFT는 DFT의 계산량을 획기적으로 줄이는 방법으로, &lt;u&gt;신호를 짝수와 홀수 인덱스로 나누어 재귀적으로 계산하는 방식을 사용&lt;/u&gt;한다. 이를 분할 정복(divide and conquer) 방식으로 접근하면 최종적으로 $\mathcal{O}(N \lg N)$의 연산량으롤 줄일 수 있다. FFT의 기본 아이디어는 다음과 같이 DFT 공식을 변형하는 것으로 시작한다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

\[\begin{aligned}
X[k] &amp;amp;= \sum_{n=0}^{N-1} x[n]e^{-j\frac{2\pi}{N}kn} \\ &amp;amp;= \sum_{n=0}^{N/2-1} x[2n]e^{-j\frac{2\pi}{N}(2n)k} + \sum_{n=0}^{N/2-1} x[2n + 1]e^{-j\frac{2\pi}{N}(2n + 1)k} \\
&amp;amp;=\underbrace{\sum_{n=0}^{N/2-1} x[2n]e^{-j\frac{2\pi}{N}(2n)k}}_{Even[k]} + e^{-j\frac{2\pi}{N}k} \underbrace{\sum_{n=0}^{N/2-1} x[2n + 1]e^{-j\frac{2\pi}{N}(2n)k}}_{Odd[k]}
\end{aligned}\]

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;문제는 $N$개의 샘플을 가진 신호를 절반씩 나누어 처리했기 때문에, 우리가 얻은 결과는 $N/2$ 크기의 변환 결과이다. 하지만 원래 신호의 길이는 $N$이므로, 전체 주파수 대역을 구성하려면 상위 절반의 주파수 성분도 고려해야 한다. 그렇기 때문에 $X[k + N/2]$ 도 계산해주어야 한다.&lt;/p&gt;

\[\begin{aligned}
X[k] &amp;amp;= E[k]+e^{-j\frac{2\pi}{N}k}O[k] \\
X[k+N/2] &amp;amp;= E[k + N/2] + e^{-j\frac{2\pi}{N}(k+N/2)} O[k + N/2] \\
&amp;amp;= E[k] - e^{-j\frac{2\pi}{N}k} O[k] 
\end{aligned}\]

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250206_DFT/figure5.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;Relationship between various Fourier transforms&lt;/em&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;DFT는 이산 시간 신호를 주파수 영역에서 이산적으로 표현하는 방법으로, DTFT에서 샘플링을 한 것과 같다.&lt;/li&gt;
  &lt;li&gt;회전 인자는 DFT를 계산하는데 사용되며, 해상도는 입력 신호의 길이 $N$에 따라 달라진다.&lt;/li&gt;
  &lt;li&gt;주기 신호에 대한 컨볼루션은 한 주기에 대해서만 컨볼루션을 하는 원형 컨볼루션을 적용한다.&lt;/li&gt;
  &lt;li&gt;FFT는 DFT의 연산량을 크게 줄인 기법으로 분할-정복 방식을 활용한다.&lt;/li&gt;
&lt;/ol&gt;
</description>
                <pubDate>Thu, 06 Feb 2025 10:55:03 +0000</pubDate>
                <link>/discrete-fourier-transform</link>
                <guid isPermaLink="true">/discrete-fourier-transform</guid>
                
                <category>Signal Processing</category>
                
                
            </item>
        
            <item>
                <title>From Analog to Digital: Sampling, Conversion, and Signal Reconstruction</title>
                <description>&lt;p&gt;디지털 신호는 컴퓨터나 전자 장치에서 연산을 빠르게 수행할 수 있다는 점에서 큰 이점을 지닌다. 하지만 우리 주변에서 접하는 신호는 대부분 아날로그 형태이므로, 이를 먼저 디지털로 변환한 뒤 처리하는 과정이 필요하다. 이번 글에서는 아날로그 신호를 디지털 신호로 전환하는 전반적인 과정을 살펴본 다음, 이때 발생할 수 있는 문제점들을 심도 있게 다루어 보고자 한다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;digital-processing-system-for-continous-signal&quot;&gt;Digital processing system for continous signal&lt;/h2&gt;

&lt;p&gt;실생활에서 접하는 아날로그 신호는 연속적인 시간 축을 갖지만, 컴퓨터로 가공하기 위해서는 먼저 디지털 형태로 변환한 뒤 연산을 수행하고, 필요하다면 다시 아날로그 신호로 복원해야 한다. 이러한 전체 과정을 그림으로 표현하면 다음과 같다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250204_SAMPLING/figure1.png&quot; alt=&quot;alt text&quot; class=&quot;centered&quot; /&gt;
&lt;em&gt;https://legacy.cs.indiana.edu/~port/teach/641/signal.proc.html&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;전처리 필터&lt;/li&gt;
  &lt;li&gt;A/D Converter&lt;/li&gt;
  &lt;li&gt;D/A Converter&lt;/li&gt;
  &lt;li&gt;후처리 필터&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;p&gt;전처리 필터는 아날로그 신호를 샘플링하기 전에 주파수 범위를 제한하여, 샘플링 과정에서 발생할 수 있는 에일리어싱(aliasing)을 미리 방지하는 역할을 한다. 이러한 이유로 전처리 필터를 anti-aliasing 필터라고 부르기도 하며, 이 필터는 뒤에서 더욱 자세히 소개하였다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250204_SAMPLING/figure2.png&quot; alt=&quot;alt text&quot; class=&quot;centered&quot; /&gt;
&lt;em&gt;이미지를 대상으로 한 anti-alasing 필터의 적용 유무 (출처: wikipedia)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A/D 변환기는 아날로그 신호를 본격적으로 디지털 신호로 변환하는 단계를 말하며, 크게 샘플링, 양자화, 부호화의 세 단계로 이루어져있다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;샘플링(Sampling): 연속적인 시간 축의 신호에서 일정한 시간 간격으로 값을 추출하는 과정&lt;/li&gt;
  &lt;li&gt;양자화(Quantization): 추출한 연속값을 이산적인 값으로 매핑하는 과정&lt;/li&gt;
  &lt;li&gt;부호화(Encoding): 양자화된 값을 2진수로 변환하는 과정&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250204_SAMPLING/figure3.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;em&gt;샘플링의 예시&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;D/A 변환기는 이와 반대로, 디지털 신호를 다시 아날로그 신호로 복원하는 기능을 수행한다. A/D 변환 과정을 역순으로 진행하지만, 역-양자화의 단계는 존재하지 않는다. 이미 양자화된 값이 ‘원래의 어떤 실수값’이었는지 정확히 되돌릴 방법이 없기 때문이다.&lt;/p&gt;

&lt;p&gt;후처리 필터는 이렇게 복원된 아날로그 파형에서 잔여 고주파 노이즈나 과도 응답(D/A 변환 과정에서 발생)을 제거해주는 과정이다. 쉽게 말해, “복원된 신호를 한 번 더 다듬어 깔끔한 아날로그 신호를 얻는” 역할을 한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;sampling&quot;&gt;Sampling&lt;/h2&gt;

&lt;p&gt;샘플링이란 연속 시간 신호에서 일정 시간 간격  $T_s$ 마다 값을 추출하여, 수열 형태의 이산 신호로 만드는 과정을 말한다. 이때 $T_s$를 샘플링 주기라고 하며, $\frac{1}{T_s}$는 샘플링 주파수, $\omega_s = \frac{2\pi}{T_s}$는 샘플링 각주파수라고 부른다.&lt;/p&gt;

\[x[n] = x(nT_s), 
\quad
f_s = \frac{1}{T_s}, 
\quad
\omega_s = \frac{2\pi}{T_s}\]

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;여기서 중요한 점은, 샘플링을 통해 얻은 이산 신호만으로는 그 사이 구간에 있었던 연속 정보가 모두 사라진다는 사실이다. 즉, 간격 $T_s$ 외부의 세밀한 변화가 손실된다는 뜻이다. 손실된 정보를 복원하는 과정은 이후 D/A 변환(Digital-to-Analog Conversion) 단계에서 이루어지는데, 과연 이러한 복원이 완벽히 가능한지 의문이 생긴다. 결론부터 말하면, 주어진 이산 신호가 존재한다고 할 때, 그것을 만들어 낼 수 있는 연속 시간 신호는 무수히 많다. 아래 그림에서 그 이유를 직관적으로 살펴볼 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250204_SAMPLING/figure4.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;em&gt;https://www.researchgate.net/figure/Aliasing-in-the-Time-Domain_fig3_265323668&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;그림처럼 가장 간단한 신호인 정현파를 예로 들어보자. 어떤 정현파 신호 $x(t) = A \cos(\omega_0 t)$ 가 있고 이것을 주기 $T_s$마다 샘플링하게 되면 아래처럼 수열을 얻을 수 있다.&lt;/p&gt;

\[x[n]=x(nT_s)=A\cos(\omega_0 n T_s)=A \cos(\Omega_0n)\]

&lt;p&gt;위 식에서 $\omega_0 T_s$ 는 이산 시간 신호에서의 각주파수(이를 $\Omega_0$라 부름) 역할을 한다. 하지만 샘플링을 거친 신호는 ‘연속적인 시간 정보’를 잃고, 샘플 순서에 해당하는 이산점들만 남게 된다. 이말은 곧, $\Omega_0$를 만들어내는 $\omega_0$와 $T_s$의 조합이 여러 개 존재할 수 있음을 의미한다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;그렇다면 둘 중 하나의 값이 고정된 경우, 예를 들어 샘플링 주기 $T_s$를 알고 있어서 $\omega_0$는 이에 따라 자동으로 결정이 된다면 완벽히 복원할 수 있을까? 그렇지 않다. 이는 정현파가 $2\pi$를 주기로 반복된다는 사실 때문에 생기는 앨리어싱(aliasing) 현상 때문이다. 가령, 주파수가 $f_0 + kf_s$인 정현파를 샘플링 주파수 $f_s$로 샘플링하면, 주파수 $f_0$인 정현파를 샘플링했을 때와 완전히 똑같은 이산 신호가 만들어진다.&lt;/p&gt;

\[\begin{aligned}
\cos(2\pi(f_0+kf_s)nT_s) &amp;amp;= \cos(2\pi f_0 nT_s+2\pi kf_s nT_s) \\
&amp;amp;= \cos(2\pi f_0n T_s + 2\pi k n) \\
&amp;amp;= \cos(2\pi f_0 n T_s)
\end{aligned}\]

&lt;hr /&gt;

&lt;h3 id=&quot;sampling-theorem&quot;&gt;Sampling Theorem&lt;/h3&gt;

&lt;p&gt;샘플링 과정은 아래 그림처럼 연속 신호 $x(t)$를 임펄스 열 $p(t)$과 곱하는, 일종의 변조로 해석할 수 있다. 직관적으로는, $x(t)$에서 $T_s$를 주기로 임펄스가 “찍혀서” 해당하는 값을 뽑아내는 것과 같다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250204_SAMPLING/figure5.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;em&gt;https://dsp.stackexchange.com/questions/84077/sampling-with-impulse-train&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;우리가 다루는 신호를 다시 떠올려보면, 푸리에 급수(또는 푸리에 변환) 관점에서 임의의 신호는 다양한 주파수를 갖는 정현파들의 합으로 표현될 수 있었다. 따라서 샘플링된 신호에서도 각 주파수 성분을 온전하게 추출할 수 있어야 하므로, 이를 주파수 영역에서 분석하는 것이 중요하다. 실제로 샘플링된 신호 $x_s(t)$의 푸리에 변환을 계산해보면, 임펄스 열 $p(t)$의 푸리에 변환 $P(\omega)$와 원 신호 $X(\omega)$의 컨볼루션 형태로 나타나게 된다.&lt;/p&gt;

\[X_s(\omega) = \mathcal{F}\{x_s(t)\} =\mathcal{F}\{x(t) \cdot p(t)\}=\frac{1}{2\pi}X(\omega)*P(\omega)\]

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;컨볼루션의 특성상, 임펄스 열의 주기적 성질로 인해 원 신호의 스펙트럼 $X(\omega)$가 주파수축 전역에 반복 복사되는 현상이 발생한다. 아래 그림은 이러한 반복 복사 과정에서 샘플링 주파수 $\omega_s$를 부적절하게 설정했을 때, &lt;strong&gt;주파수 중첩(aliasing) 문제&lt;/strong&gt;가 생기는 예시를 보여준다.&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250204_SAMPLING/figure6.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;주파수 중첩 예시&lt;/em&gt;
&lt;/div&gt;

&lt;p&gt;샘플링이 끝난 뒤에는, 원하는 신호 대역만 남기기 위해 &lt;strong&gt;저역 통과 필터(low-pass filter)&lt;/strong&gt;를 사용한다. 그러나 이미 &lt;strong&gt;주파수 중첩&lt;/strong&gt;이 일어난 상태라면, 필터링으로도 원래 신호의 대역을 온전하게 분리할 수 없다. 결국 &lt;strong&gt;주파수 중첩&lt;/strong&gt;이 발생하지 않도록 &lt;strong&gt;샘플링 주파수&lt;/strong&gt; $\omega_s$를 충분히 크게 잡는 것이 핵심이다.&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250204_SAMPLING/figure7.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;저역 통과 필터 적용 시각화&lt;/em&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;그렇다면, &lt;strong&gt;얼마나 큰 $\omega_s$가 필요할까?&lt;/strong&gt; 위 그림을 살펴보면, 원래 신호가 차지하는 대역폭이 $\omega_b$ 라고 할 때, &lt;strong&gt;$2\omega_b$&lt;/strong&gt; 이상의 샘플링 주파수를 확보해야 반복된 스펙트럼이 서로 겹치지 않는다는 것을 알 수 있다. 이러한 사실을 공식화한 것이 바로 &lt;strong&gt;나이퀴스트-섀넌(Nyquist-Shannon) 샘플링 정리&lt;/strong&gt;이다. 이는&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;최대 주파수가 $\omega_b$인 신호를 완벽히 복원하려면,&lt;br /&gt;
샘플링 각주파수 $\omega_s$가 적어도 $2\omega_b$ 이상이어야 한다.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;라고 요약할 수 있으며, 실제 디지털 신호처리나 통신 시스템 설계의 핵심이론으로 널리 적용되고 있다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;signal-reconstruction&quot;&gt;Signal reconstruction&lt;/h2&gt;

&lt;p&gt;앞서 설명한 대로, 스펙트럼이 주기적으로 반복될 때 &lt;strong&gt;서로 겹치지만 않으면&lt;/strong&gt; 원래 신호를 &lt;strong&gt;정확히 복원&lt;/strong&gt;할 수 있다고 했다. 그러나 실제 환경에서는 이 이론이 그대로 들어맞지 않는 경우가 많다. 그 주된 이유는 두 가지이다:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;이상적인 저역 통과 필터 $H(\omega)$를 구현하기가 불가능하다.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;일상생활 신호는 유한 길이를 갖고 있다.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;이는 곧, 해당 신호의 스펙트럼 대역이 이론적으로 무한히 뻗어있다는 의미이다. 앞에서 보았던 파란색 삼각형 처럼 주파수 범위가 깔끔하게 제한되지 않으므로, 결국 주파수 중첩 문제를 피하는 것이 불가능하다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;이러한 현실적 제약을 감안하면, 주파수 중첩문제를 완벽하게 해결하는 대신, 가능한 한 최소화하는 쪽으로 접근해야 한다. 대표적인 2가지 방안은 다음과 같다:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;중첩을 완전히 피하기 어렵다면 최소화하자.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;즉, 샘플링 주파수를 충분히 높게 잡아 중첩 구간을 최대한 줄이는 것이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;스펙트럼 대역을 적절히 제한하자.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;신호가 사실상 무한 대역폭을 가질 수 밖에 없다면, 저역 통과 필터 등을 사용해 정보 손실을 최소화하면서 대역을 제한하는 것이다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;ideal-reconstruction&quot;&gt;Ideal reconstruction&lt;/h3&gt;

&lt;p&gt;디지털 신호를 아날로그 형태로 가장 이상적으로 복원하기 위해서는, 앞서 봤듯이 이상적인 저역 통과 필터(사각 필터)를 적용하면 된다. 이는 주파수 영역에서 사각형 형태의 필터 $H(\omega)$로 표현할 수 있으며, 시간 영역에서는 $\text{sinc}$ 함수가 된다. 다시 말해, 이상적인 D/A 변환은 $\text{sinc}$ 함수들의 가중합 형태로 이해할 수 있다.&lt;/p&gt;

\[H(\omega)=\begin{cases} 1, &amp;amp; |\omega| \le \omega_c, \\ 0, \quad &amp;amp; \text{그 외} \end{cases}\]

&lt;p&gt;이 필터의 시간 영역 임펄스 응답 $h(t)$는 푸리에 역변환을 통해 다음과 같이 유도된다:&lt;/p&gt;

\[\begin{aligned}
h(t)&amp;amp;=\mathcal{F}^{-1} \{H(\omega)\}=\frac{1}{2\pi} \int_{-\omega_c}^{\omega_c} 1\cdot e^{j\omega t} d\omega \\
&amp;amp;= \frac{1}{2\pi} 
  \Bigl[\underbrace{\frac{e^{j\omega t}}{j t}}_{\text{적분 결과}} \Bigr]_{-\omega_c}^{\omega_c}
= \frac{1}{2\pi} \cdot \frac{1}{j t} 
  \Bigl(e^{j\omega_c t} - e^{-j\omega_c t}\Bigr)
= \frac{1}{2\pi} \cdot \frac{2j \,\sin(\omega_c t)}{j t} \\
&amp;amp;= \frac{\sin(\omega_c t)}{\pi t} = \frac{\omega_c}{\pi} \text{sinc}\left( \frac{\omega_c t}{\pi} \right).
\end{aligned}\]

&lt;p&gt;다시, 원래의 신호에 low pass filter를 적용한 것은 아래 수식으로 나타난다:&lt;/p&gt;

\[\begin{aligned}
X_r(\omega)=X_s(\omega)\cdot H(\omega) \quad \Longleftrightarrow \quad
x_r(t) &amp;amp;= x_s(t) * h(t) \\
&amp;amp;= \sum_{k=-\infty}^{\infty} x(kT_s) \cdot T_s \frac{\omega_c}{\pi} \text{sinc}\left( \frac{\omega_c(t-kT_s)}{\pi} \right)
\end{aligned}\]

&lt;p&gt;결국 복원된 신호 $x_r(t)$는 “ $\text{sinc}$ 함수가 $kT_s$ 마다 시프트되어 겹쳐진 것”으로, 각 샘플 $x[k]$ 이 해당 $\text{sinc}$ 파형의 진폭을 결정한다. 이를 $\text{sinc}$ 보간 또는 이상적 재구성(reconstruction)이라 부르며, 나이퀴스트 샘플링 정리가 성립하는 조건하에서 원 신호를 이론상 완벽히 복원할 수 있음을 보여준다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250204_SAMPLING/figure8.png&quot; alt=&quot;alt text&quot; class=&quot;centered&quot; /&gt;
&lt;em&gt;https://electronics.stackexchange.com/questions/354346/how-is-the-sinc-function-used-to-reconstruct-an-analog-signal-from-a-digital-sig&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;zero-order-hold-reconstruction&quot;&gt;Zero order hold reconstruction&lt;/h3&gt;

&lt;p&gt;이론적으로는 &lt;strong&gt;무한 길이의 $\text{sinc}$ 필터&lt;/strong&gt;를 이용해 아날로그 신호를 완벽히 복원할 수 있지만, 실제 아날로그 회로나 DSP 기법으로 이를 구현하는 것은 사실상 불가능하다. 따라서 보다 현실적인 방법들이 사용되는데, 그 중 가장 널리 쓰이는 대안이 &lt;strong&gt;영차 홀드(Zero-Order Hold, ZOH) 방식이다&lt;/strong&gt;.&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250204_SAMPLING/figure9.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;Zero order hold reconstruction&lt;/em&gt;
&lt;/div&gt;

&lt;p&gt;영차홀드의 아이디어는 매우 간단하다. 각 샘플이 된 값을 시작점으로 하는 사각형을 그리는 것이다. 마치 모두 그려놓고 보면 구분구적법과 매우 비슷하게 보여진다. 영차홀드는 한 샘플링 주기 $T_s$ 동안 그 값을 그대로 유지하기에 임펄스 응답은 사각펄스로서 주어진다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;영차 홀드&lt;/strong&gt;의 아이디어는 간단하다. &lt;strong&gt;각 샘플의 값을 일정 시간 $T_s$동안 그대로 유지&lt;/strong&gt;하는 것이다. 샘플링 주기 $T_s$마다 ‘사각형 파형’을 그리는 형태인데, 이를 모아 보면 구분구적법을 연상시키기도 한다. 이때, ZOH의 임펄스 응답은 사각 펄스로 표현할 수 있다:&lt;/p&gt;

\[h_{zoh}(t)= u(t) - u(t-T_s) \quad\Longleftrightarrow\quad
H_{zoh}(\omega)=\frac{1-e^{-j \omega T_s}}{j\omega} = T_s\,\text{sinc}\left(\frac{\omega}{\omega_s}\right) e^{-j\frac{T_s}{2}\omega}\]

&lt;p&gt;그러므로 샘플링 신호 $x_s(t)$와의 컨볼루션으로 복원된 신호를 얻으면,&lt;/p&gt;

\[x_r(t)=x_s(t)*h_{zoh}(t)=\sum_{k=-\infty}^{\infty} x(k T_s)\cdot h_{zoh}(t-kT_s).\]

&lt;p&gt;영차홀드(ZOH)는 구현이 매우 쉽고, 샘플링 주파수 $f_s$를 충분히 높게 잡으면 꽤 양호한 복원 품질을 보인다는 장점이 있다. 이 때문에 실무에서 가장 흔히 사용되는 복원 방식 중 하나이다.&lt;/p&gt;

&lt;blockquote class=&quot;q-left&quot;&gt;
  &lt;p&gt;영차 홀드는 다음 샘플 값이 발생할 때까지,&lt;br /&gt;
현재의 샘플 값을 그대로 유지하는 형태의 신호 복원 방법이다.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;first-order-hold-reconstruction-linear-interpolation&quot;&gt;First order hold reconstruction (linear interpolation)&lt;/h3&gt;

&lt;p&gt;이론적으로 좀 더 높은 복원 성능을 기대할 수 있는 방법은 &lt;strong&gt;일차 홀드(First-Order Hold, FOH)&lt;/strong&gt; 방식이다. 일차 홀드는 샘플들을 직선으로 이어 원래 파형을 복원하기 때문에, &lt;strong&gt;선형 보간(linear interpolation)&lt;/strong&gt;이라고도 불린다. 즉, 사각형이 아닌 &lt;strong&gt;삼각형 형태&lt;/strong&gt;의 파형을 사용하여 꺾은선 그래프처럼 신호를 복원하는 셈이다.&lt;/p&gt;

\[h_{foh}(t)=\begin{cases} \frac{1}{T_s}t + 1, &amp;amp; -T_s &amp;lt; t &amp;lt;0 \\ -\frac{1}{T_s}+1, &amp;amp; 0 &amp;lt; t &amp;lt; T_s \\ 0, &amp;amp; \text{그 외}\end{cases} \quad \Longleftrightarrow \quad H_{foh}(\omega) = T_s \,\text{sinc}^2\left(\frac{\omega}{\omega_c}\right).\]

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250204_SAMPLING/figure10.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;First order hold reconstruction&lt;/em&gt;
&lt;/div&gt;

&lt;p&gt;간단히 말해, 두 개의 샘플 값 사이를 직선으로 보간하므로, ZOH보다 더 자연스러운 복원을 기대할 수 있다. 하지만 회로나 소프트웨어 구현이 ZOH에 비해 복잡하고 고속 처리가 필요한 경우에는 계산 비용이나 하드웨어 구성이 부담이 될 수 있다. 그래도 정밀도가 중요한 곳에서는 FOH가 ZOH보다 더 나은 결과를 제공하기도 한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;아날로그 신호를 디지털로 바꾸는 과정은 전처리 필터, A/D 변환기, D/A 변환기, 후처리 필터로 구성되어 있었다. 특히 A/D 변환 과정에서는 샘플링, 양자화, 부호화의 과정을 거치게 되며 이중 샘플링 과정에서 발생할 수 있는 문제점들 그리고 샘플링 주파수의 설정 방법등을 샘플링 정리를 통해 살펴보았다.&lt;/p&gt;

&lt;p&gt;Nyquist frequency는 신호가 갖는 최고 주파수의 2배에 해당하는 주파수로 원래의 아날로그 신호로 복원하기 위해서는 이보다 더 높은 주파수를 갖게 샘플링을 해야함을 보았다. 사각 필터는 시간 축에서 무한한 길이의 신호로 구성되어 있는데 현실적으로 이를 구현하는 것은 매우 어렵기 때문에 영차홀드 또는 일차홀드를 사용해 근사하는 방법도 같이 보았다.&lt;/p&gt;
</description>
                <pubDate>Mon, 03 Feb 2025 04:55:03 +0000</pubDate>
                <link>/from-analog-to-digital-sampling-conversion-and-signal-reconstruction</link>
                <guid isPermaLink="true">/from-analog-to-digital-sampling-conversion-and-signal-reconstruction</guid>
                
                <category>Signal Processing</category>
                
                
            </item>
        
            <item>
                <title>Understanding LTI Systems: Impulse Response, Convolution, and Difference Equations</title>
                <description>&lt;p&gt;LTI 시스템을 이해하기 위해서는 임펄스 응답과 컨볼루션 그리고 차분 방정식이 어떤 의미를 갖는 파악하는 것이 중요하다. 임펄스 신호만을 가지고 시스템의 특성을 간단하고도 강력하게 파악할 수 있고, 해당 시스템이 어떤 구조를 갖고있는지도 차분 방정식을 통해 수학적으로 나타낼 수 있다. 이번 글에서는 각 개념들에 대해 살펴보고 차분 방정식을 어떻게 풀어나가는지 소개해보려고 한다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;impuse-response&quot;&gt;Impuse response&lt;/h2&gt;

&lt;p&gt;임펄스 응답은 시스템에 이산 임펄스 신호 $\delta[n]$ 을 입력하였을 때 출력으로 나타나는 시스템의 응답 $h[n]$을 말한다. 임펄스 신호는 ‘현재 시점에 입력할 수 있는 가장 간단한 신호’로 볼 수 있는데, 이 신호로부터 시스템이 어떤 성질을 갖는지 분석해볼 수 있다. 이처럼 간단한 신호로 분석할 수 있는 이유는 시스템이 선형-시불변성을 갖기 때문이다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250203_LTI/figure1.png&quot; alt=&quot;Input and output of the system&quot; /&gt;
&lt;em&gt;https://onscale.com/impulse-response-modeling-in-onscale/&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;LTI 시스템에 들어가는 임의의 입력 신호는 ‘임펄스 신호에 대한 가중합’으로 나타낼 수 있다고 지난 글에서 소개했던 적이 있다. 그렇기 때문에, 임펄스 신호만 알고 있다면 그 어떤 입력 신호에 대해서도 해당 신호의 출력을 유추해낼 수 있다. 위 임펄스 응답은 출력이 유한한지 무한한지에 따라 다음으로 나뉘어 진다:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;유한 임펄스 응답 (FIR, Finite Impulse Response): 임펄스 응답의 길이가 유한한 시스템&lt;/li&gt;
  &lt;li&gt;무한 임펄스 응답 (IIR, Infinite Impulse Response): 임펄스 응답의 길이가 무한한 시스템&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;convolution&quot;&gt;Convolution&lt;/h2&gt;

&lt;p&gt;임의의 이산 신호는 시간 이동된 임펄스 신호들의 가중합으로서 바라볼 수 있었다. 이를 수식으로 써보면 다음과 같다:&lt;/p&gt;

\[\begin{aligned}
x[n] &amp;amp;= \cdots + x[-1]\delta[n+1]+x[0]\delta[n]+\cdots+x[k]\delta[n-k]+\cdots \\
&amp;amp;= \sum_{k=-\infty}^{\infty}x[k]\delta[n-k].
\end{aligned}\]

&lt;p&gt;LTI 시스템의 선형성(동차성과 가산성)에 의하면, 각각의 임펄스 신호 $\delta[n-k]$에 대한 출력만 알고 있어도(즉, 임펄스 응답만 알아도) 전체 입력 $x[n]$이 들어갔을 때의 출력을 합을 통해 쉽게 구할 수 있다.&lt;/p&gt;

\[\begin{aligned}
y[n]&amp;amp;=H\{x[n]\}=\cdots+H\{x[0]\delta[n]\}+\cdots+H\{x[k]\delta[n-k]\}+\cdots \\
&amp;amp;=\sum_{k=-\infty}^{\infty}x[k]H\{\delta[n-k]\}
\end{aligned}\]

&lt;p&gt;이 연산을 컨볼루션(Convolution)이라 하며, 기호로는 $*$를 사용하여 다음과 같이 표현한다.&lt;/p&gt;

\[y[n]=\sum_{k=-\infty}^{\infty}x[k]H\{\delta[n-k]\} = x[n]*h[n]\]

&lt;p&gt;만약 시스템이 causal 시스템인 경우, 합의 범위가 $[0, \infty]$ 로 변경된다. 컨볼루션 연산은 기본적인 연산 법칙 (교환법칙, 결합법칙, 분배법칙)이 성립하기에 필요에 따라 적절하게 변형시켜 연산량을 줄이는 것이 좋다. 아래 애니메이션은 컨볼루션 연산의 결과를 시각화한 것이며, 결과를 보면 $N$의 길이를 갖는 이산 신호와 $M$의 길이를 갖는 이산신호에 대해 컨볼루션 연산을 취한 결과는 $N + M - 1$ 의 길이를 갖는다는 것을 알 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://e2eml.school/images/conv1d/aa_copy.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;difference-equation-interpreting-lti-system&quot;&gt;Difference equation: Interpreting LTI system&lt;/h2&gt;

&lt;p&gt;본 주제에서 가장 까다롭게 느꼈던 부분은 차분 방정식(Difference Equation)을 풀어내는 과정이다. 크게는 반복 대입법과 고전적 해법을 통해 접근할 수 있고, 이 과정에서 특성 방정식과 특성근을 어떻게 구하고 해석하는지 알게 된다. 먼저, 가장 일반적인 형태의 차분 방정식을 생각해보자:&lt;/p&gt;

\[y[n]+a_1 y[n-1]+\cdots + a_py[n-p]=b_0x[n]+\cdots+b_qx[n-q]\]

&lt;p&gt;차분 방정식을 보면, 출력 $y[n]$이 단순히 입력 $x[n]$에 의해서만 결정되는 것이 아니라, 시스템 내부가 가진 이전 출력 $y[n-k]$에도 의존함을 알 수 있다. 그리고 초기 상태로 부터 한단계씩 나아가 최종 출력을 계산하는 방법을 반복 대입법이라고 한다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;반복 대입법&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;차분 방정식의 좌변에 $y[n]$만 남기고 우변으로 넘겨 정리한다.&lt;/li&gt;
  &lt;li&gt;시작 지점 $n=i$에서 주어진 초기조건과 이미 알고 있는 입력 신호들을 대입하여 $y[i]$를 계산한다.&lt;/li&gt;
  &lt;li&gt;이후 $n=i+1$ 값으로 넘어가, 이전 단계에서 구한 $y[i]$를 차분 방정식에 대입하여 $y[i + 1]$을 구한다. 이런식으로 단계별로 쭉 반복하여, 원하는 구간까지 $y[n]$을 계산할 수 있다.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;방정식이 간단하거나 차수가 낮은 경우에는 반복 대입법을 통해 닫힌 꼴(closed-form)의 해를 구할 수 있다. 그러나 차수가 높아질수록 해를 구하는 과정이 매우 복잡해져 비효율적이므로 고전적 해법을 이용한다. 이 방법은 차분 방정식의 해가 &lt;strong&gt;동차해(homogeneous solution)&lt;/strong&gt; $y_h[n]$와 &lt;strong&gt;특이해(particular solution)&lt;/strong&gt; $y_p[n]$의 합으로 이루어진다는 점에 착안하여 문제를 해결한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;homogeneous-solution&quot;&gt;Homogeneous solution&lt;/h3&gt;

&lt;p&gt;동차해는 시스템에 외부입력이 가해지지 않았을 때($x[n]=0$)의 해, 즉 &lt;strong&gt;시스템 자체의 고유 특성이 반영된 응답&lt;/strong&gt;을 말한다. 이 응답은 시스템의 &lt;strong&gt;특성근(characteristic roots)&lt;/strong&gt;으로 부터 구할 수 있고, 특성근의 중복 여부에 따라 해의 형태가 달라진다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;특성근이 모두 서로 다른 경우&lt;/strong&gt;:&lt;/p&gt;

\[y_h[n] = c_1 \gamma_1^n + c_2 \gamma_2^n + \cdots + c_p \gamma_p^n\]

    &lt;p&gt;여기서 $\gamma_1, \gamma_2, \dots, \gamma_p$는 특성근이고, $c_1, c_2, \dots, c_p$는 상수&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;특성근이 중근을 갖는 경우&lt;/strong&gt;:&lt;/p&gt;

    &lt;p&gt;예로, 특성근 $\gamma_1$이 $m$-중근이라면, 해당 근에 대한 해는 다음과 같이 표현된다.&lt;/p&gt;

\[y_h[n] = (c_1 + c_2 n + \cdots + c_m n^{m-1}) \gamma_1^n + \cdots + c_p \gamma_p^n\]
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;particular-solution&quot;&gt;Particular solution&lt;/h3&gt;

&lt;p&gt;특이해는 시스템에 &lt;strong&gt;외부에서 가해지는 입력(자극)에 의해 발생하는 출력&lt;/strong&gt;을 의미한다. 이는 시스템의 고유한 특성과는 무관하며, 입력의 형태에 따라 달라진다. 여기까지 보면, 입력에 의해 발생하는 결과와 시스템 자체가 갖고 있는 특성으로 인해 만들어지는 결과를 합쳐서 차분방정식을 구성한다는 것으로 볼 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote class=&quot;q-left&quot;&gt;
  &lt;p&gt;차분 방정식의 해는 시스템이 지닌 고유한 특성과&lt;br /&gt;
입력으로 인해 발생하는 결과를 더한것으로 구성된다.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;characteristic-equation&quot;&gt;Characteristic equation&lt;/h3&gt;

&lt;p&gt;위에서 계속 언급했던 특성근을 구하기 위해서는 특성 방정식을 세워야 한다. 차분 방정식에서 시간 지연 항(예: $y[n-1]$, $y[n-2]$)을 각각 $\gamma^{n-1}$, $\gamma^{n-2}$로 대체해 나가다 보면, 다음과 같은 다항식인 특성방정식을 얻게 된다.&lt;/p&gt;

\[\gamma^p + a_1 \gamma^{p-1} + \cdots + a_{p-1} \gamma + a_p = (\gamma - \gamma_1)(\gamma - \gamma_2) \cdots (\gamma - \gamma_p) = 0\]

&lt;p&gt;이 방정식의 해인 $\gamma_i$들을 통해, 시스템이 외부 입력이 없을 때 어떤 거동을 보이는지, 즉 안정적으로 수렴하는지, 발산하는지, 혹은 계속 진동하는지 등을 판별할 수 있다.&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250203_LTI/figure2.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;특성방정식과 특성근&lt;/em&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;example&quot;&gt;Example&lt;/h3&gt;

&lt;p&gt;다음과 같은 차분 방정식이 있다고 가정해보자:&lt;/p&gt;

\[y[n]-1.5y[n-1]+0.5y[n-2]=0\]

&lt;p&gt;차분 방정식에서 우변이 0인 것으로 보아, 해당 시스템에는 입력이 인가되지 않는 시스템을 분석하고 있다는 것을 엿볼 수 있다. 그렇다면 초기조건에 의해 시스템이 어떠한 상태를 갖는지 살펴보는 것과 같다. 위 차분 방정식의 특성 방정식은 다음과 같다.&lt;/p&gt;

\[\gamma^2-1.5\gamma+0.5=0 \qquad \Rightarrow \qquad \gamma_1=1,\;\gamma_2=0.5\]

&lt;p&gt;특성근은 각각 1과 0.5의 값을 갖는데, 이로부터 이 시스템은 시간이 지나면서 일부 항은 유지되고 일부 항은 사라지는 중립(또는 안정에 가까운) 거동을 보인다는 사실을 확인할 수 있다. 구체적으로는 초기조건에 따라 $c_1 \cdot 1^n + c_2 \cdot 0.5^n$ 형태로 응답이 결정될 것이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;지금까지 임펄스 응답과 컨볼루션을 통해 LTI 시스템의 출력을 분석하는 기본 메커니즘을 살펴보았고, 이어서 차분 방정식을 이용해 시스템의 동작 원리를 보다 수학적으로 이해하는 방법을 알아보았다. 비교적 간단해보이는 임펄스 응답만으로도 실제로는 매우 폭넓은 시스템의 거동을 설명할 수 있다는 것에 놀라게 되었다. 한편으로, 이런 임펄스 응답과 컨볼루션에 대한 개념을 확실히 하게 된다면 LTI 시스템에 대해 더욱 깊이 있는 이해를 할 수 있을 것이라 생각된다.&lt;/p&gt;
</description>
                <pubDate>Mon, 03 Feb 2025 04:13:03 +0000</pubDate>
                <link>/understanding-lti-systems</link>
                <guid isPermaLink="true">/understanding-lti-systems</guid>
                
                <category>Signal Processing</category>
                
                
            </item>
        
            <item>
                <title>Discrete signal and system: Concept of periodicity and LTI System</title>
                <description>&lt;p&gt;이전 글에서는 기본적인 신호에 대한 개념과 시스템의 개념을 살펴보았다. 오늘 정리할 것은 이산 신호에서 주기 신호와 비주기 신호를 더 자세히 알아보고, LTI 시스템이 무엇인지 그리고 시스템의 안정성을 판단하는 한 가지 방법을 보려고 한다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;discrete-periodic-signals&quot;&gt;Discrete periodic signals&lt;/h2&gt;

&lt;p&gt;신호는 시간 축의 성질에 따라 연속적인지 이산적인지 나누어볼 수 있었는데 이번에는 전체적으로 신호가 주기적으로 반복되는지 안되는지 나누어볼 것이다. 주기 신호는 같은 파형이 주기를 갖고 계속해서 반복되는 신호로 이산 시간 신호에서는 아래와 같이 정의한다:&lt;/p&gt;

\[x[n+N]=x[n]\]

&lt;ul&gt;
  &lt;li&gt;$N$: 주기&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250124_DSS/figure6.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;em&gt;주기 $N=8$을 갖는 이산 주기 신호&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;basic-discrete-signals&quot;&gt;Basic discrete signals&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Impulse signal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;이산 임펄스 신호 $\delta[n]$은 극한 개념을 적용하여 정의하는 연속 임펄스 신호 $\delta(t)$와는 달리 물리적으로 존재하는 가장 단순한 신호이다. 이 신호는 이산 신호를 표현하는 데 있어 가장 기본이 되는 신호로서 사용되며, 이산 신호는 시간 이동된 임펄스 신호들의 가중합으로 나타낼 수 있다.&lt;/p&gt;

\[\delta[n]=\begin{cases} 1, &amp;amp; n = 0 \\ 0, &amp;amp; n \neq 0\end{cases} \qquad x[n] = \sum_{k=-\infty}^{\infty} x[k] \delta[n-k]\]

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Unit step signal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unit step signal $u[n]$은 $n≥0$ 에서 항상 값이 1인 신호를 말한다. 이는 마치 $n=0$ 을 경계로 전류를 보내는 스위치 동작으로 이해할 수 있어 여러 종류의 신호를 표현하는데 사용된다. 또한, 단위 계단 신호를 사용한다면 $\delta[n]$은 $u[n]$의 차분으로 해석할 수 있고, $u[n]$은 $\delta[n]$의 이동합으로 표현할 수 있다.&lt;/p&gt;

\[u[n]=\begin{cases}1, &amp;amp; n \ge 0 \\ 0,  &amp;amp; n &amp;lt; 0 \end{cases} \qquad \delta[n] = u[n]-u[n-1]\]

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250124_DSS/figure1.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;이산 임펄스 신호와 이산 계단 신호&lt;/em&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Discrete exponential signal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;이산 지수 신호는 $a^n$ 꼴로 나타내는데, $a$값의 종류에 따라 실수 지수 신호와 복소 지수 신호로 나눌 수 있다.&lt;/p&gt;

\[x[n]=a^n\]

&lt;ul&gt;
  &lt;li&gt;이산 &lt;strong&gt;실수&lt;/strong&gt; 지수 신호: $a$가 실수인 경우로서, $a$값에 따라 여러 종류의 형태의 그래프가 그려진다. $a$가 음수이면 음과 양의 값이 번갈아 가면서 진동하는 것처럼 나타난다. (그림 참고)&lt;/li&gt;
  &lt;li&gt;이산 &lt;strong&gt;복소&lt;/strong&gt; 지수 신호: $a$가 복소수인 가장 일반적인 형태의 지수 신호로, 실수 지수 신호와 정현파 신호가 복합된 특성을 나타낸다. $x[n]=(re^{j\Omega_0})^n$&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250124_DSS/figure2.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;밑의 변화에 따른 이산 실수 지수 신호의 차이&lt;/em&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;특히, $a$가 복소수인 경우 지수 신호 $x[n]$은 복소 정현파 신호가 된다. 오일러 공식에 의해 지수 신호는 2개의 정현파가 결합된 신호로 분리해서 볼 수 있다.&lt;/p&gt;

\[x[n]=e^{j\Omega_0 n}=\cos(\Omega_0n)+j\sin(\Omega_0n)\]

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250124_DSS/figure3.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;밑의 변화에 따른 이산 복소 지수 신호의 차이&lt;/em&gt;
&lt;/div&gt;

&lt;p&gt;세 번째 그림은 정현파 신호를 적절히 샘플링하여 얻은 결과처럼 보일 수 있지만, 이산 시간 정현파가 항상 그렇게 해석되는 것은 아니다. 일반적으로 정현파 신호는 주기적인 특성을 가지며, 이러한 주기성을 만족하려면 다음의 조건이 필요하다.&lt;/p&gt;

&lt;blockquote class=&quot;q-left&quot;&gt;
  &lt;p&gt;&lt;em&gt;이산 복소 정현파 신호가 주기성을 가지려면,&lt;br /&gt;
각주파수 $\Omega_0$를 $2\pi$로 나눈 값이 유리수여야 한다.&lt;/em&gt;&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;조금 더 깊게 생각해보면, 각주파수 $\Omega$가 $2\pi$의 정수 배만큼 차이 나는 이산 정현파들은 동일한 신호로 간주될 수 있다. 이는 오일러 공식을 통해 sinusoids가 $2\pi$를 배수로 하여 주기성을 갖는 특성을 지니기 때문이다. 따라서, 이산 정현파 신호는 주파수 구간 $0 \le \Omega_0 &amp;lt; 2\pi$ 내에서만 서로 구분될 수 있다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;discrete-system&quot;&gt;Discrete system&lt;/h2&gt;

&lt;p&gt;시스템은 입력을 받아 출력을 생성하는 것을 목적으로 한다. 특정 시스템의 규칙은 수식으로 표현할 수 있으며, 특히 시간 영역이 이산적으로 주어진 시스템의 입출력 관계는 &lt;strong&gt;차분방정식&lt;/strong&gt;으로 나타낸다:&lt;/p&gt;

\[y[n] + a_1 y[n-1] + \cdots + a_p y[n-p] = b_0 x[n] + \cdots + b_q x[n-q]\]

&lt;p&gt;이를 변형하면 다음과 같은 형태로 쓸 수 있다:&lt;/p&gt;

\[y[n] = -\sum_{k=1}^p a_k y[n-k] + \sum_{k=0}^q b_k x[n-k]\]

&lt;ul&gt;
  &lt;li&gt;$a_k$: 과거 출력에 대한 가중치&lt;/li&gt;
  &lt;li&gt;$b_k$: 입력 신호에 대한 가중치&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;처음 이 식을 접했을 때는, 시스템이 왜 이런 방식으로 표현되는지 이해하기 어려웠다. 그러나 이 식은 특정 시스템만을 표현하기 위한 것이 아니라, &lt;strong&gt;모든 이산 신호 시스템을 공통적으로 나타내기 위한 일반적인 수식&lt;/strong&gt;이다.&lt;/p&gt;

&lt;p&gt;식에서 $b_k$가 계수로 사용되는 항은 &lt;strong&gt;현재 입력 신호를 처리하는 과정&lt;/strong&gt;을 의미한다. 반면, $a_k$가 계수로 사용되는 항은 &lt;strong&gt;이전 출력 값을 이용해 현재 출력을 계산&lt;/strong&gt;하는 과정을 나타낸다. 이를 통해 시스템이 입력과 과거 출력을 모두 활용하여 출력을 생성한다는 사실을 알 수 있다. (참고로, 두 항의 합 구간이 서로 다름에 주목하자.)&lt;/p&gt;

&lt;blockquote class=&quot;q-left&quot;&gt;
  &lt;p&gt;즉, 시스템의 출력은 현재 및 과거 입력과 출력 값의 조합으로 결정된다.&lt;br /&gt;
이를 ARMA(Auto-Regressive Moving Average) 모델이라고도 한다.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;classification-of-discrete-system&quot;&gt;Classification of discrete system&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Linear time-invariant system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;신호를 구분했던 것 처럼, 시스템도 입력 신호의 종류에 따라 연속 시간 신호와 이산 시간 신호로 구분할 수 있다. 하지만 여기서 볼 것은 다른 관점으로 살펴볼 예정이다. 먼저 LTI 시스템은 &lt;strong&gt;선형성(linearity)&lt;/strong&gt;와 &lt;strong&gt;시불변성(time-invariant)&lt;/strong&gt;을 동시에 만족하는 시스템을 의미한다. 각 특징에 대한 설명을 살펴보자:&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;선형성&lt;/strong&gt;이란, 시스템에 여러 신호가 동시에 입력될 때 출력이 각 신호를 따로 입력했을 때의 출력의 합과 동일해지는 &lt;strong&gt;가산성&lt;/strong&gt;(additivity)과, 입력 신호의 크기를 배수로 늘리면 출력도 동일한 배수로 증가하는 &lt;strong&gt;동차성&lt;/strong&gt;(homogeneity)을 모두 만족하는 성질을 말한다. 이 두 성질을 동시에 만족하는 것을 &lt;strong&gt;중첩의 원리&lt;/strong&gt;(superposition property)라고 하며, 이는 다음과 같이 수식으로 표현된다:&lt;/p&gt;

\[H(x_1) = y_1, \quad H(x_2) = y_2 \quad \rightarrow \quad H(\alpha x_1 + \beta x_2) = \alpha y_1 + \beta y_2\]

&lt;p&gt;선형성을 갖는 시스템이 중요한 이유는 복잡한 신호도 단순한 신호들로 분해하여 분석할 수 있기 때문이다. 예를 들어, 이산 신호는 이산 임펄스 신호의 합으로 분리될 수 있는데, 선형성을 이용하면 각 임펄스 신호에 대한 응답을 개별적으로 계산하고 이를 합산하여 전체 응답을 구할 수 있다. 이러한 접근은 신호 해석을 훨씬 간단하게 만들어준다.&lt;/p&gt;

&lt;p&gt;반면, &lt;strong&gt;비선형 시스템&lt;/strong&gt;에서는 이러한 분해와 분석이 불가능하다. 즉, 입력 신호의 개별적인 성질을 이용해 시스템 전체의 응답을 추론할 수 없으므로, 분석과 설계가 훨씬 더 어렵고 복잡해진다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;한편, 시불변 시스템은 입력을 넣어주는 시간에 상관없이 같은 입력에 대해 항상 같은 출력을 나타내는 시스템이다. 이는 입력 신호를 $n_0$만큼 지연해서 넣어주면 출력 신호도 $n_0$만큼 지연시켜서 나오는 시스템과 같다.&lt;/p&gt;

\[H\{x[n]\}=y[n] \quad \rightarrow \quad H\{x[n-n_0]\}=y[n-n_0]\]

&lt;p&gt;&lt;img src=&quot;/images/20250124_DSS/figure4.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;em&gt;System Design for Uncertainty (Hover and Triantafyllou)&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Causal system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;실생활에서 물리적으로 현재의 어떤 영향이 과거에 영향을 미칠 수는 없지만, 그 영향은 미래까지 지속될 수 있다. 이러한 맥락에서 &lt;strong&gt;미래의 입력이 현재의 출력에 영향을 미치지 않는&lt;/strong&gt; 성질을 &lt;strong&gt;인과성&lt;/strong&gt;(causality)이라고 한다. 인과성을 갖는 시스템을 &lt;strong&gt;인과 시스템&lt;/strong&gt;(causal system)이라 하며, 이러한 시스템은 입력이 발생하기 전에는 출력을 생성하지 않는다.&lt;/p&gt;

\[x[n]=0, \quad n\le n_0 \text{일 때,} \quad y[n]=0, \quad n \le n_0\]

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250124_DSS/figure5.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;인과 시스템과 비인과 시스템&lt;/em&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Stable system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;시스템을 분류하는 또 다른 기준은 안정도이다. 그렇다면 시스템의 안정도는 어떻게 평가할 수 있을까? 안정도를 정의하는 방법에는 여러 가지가 있지만, 가장 널리 사용되는 것은 유한 입력 유한 출력 안정성(Bounded Input Bounded Output, BIBO 안정도)이다. BIBO 안정도는 말 그대로 입력이 유한하면 출력도 유한하다는 것을 의미한다. 여기서 ‘유한하다’는 것은 신호의 크기가 일정한 범위를 넘지 않는다는 뜻이다.&lt;/p&gt;

&lt;p&gt;예를 들어, 어떤 시스템에 특정 크기 이하의 신호가 입력되었을 때, 출력 신호의 크기도 항상 일정한 한계 안에 머문다면, 이 시스템은 BIBO 안정도를 만족한다고 할 수 있다. 반대로, 입력이 유한함에도 출력이 무한히 커지거나 폭주한다면 그 시스템은 안정적이지 않은 것으로 판단된다.&lt;/p&gt;

\[|x[n]|\le M_x &amp;lt; \infty \; \text{일 때,} \quad |y[n]|\le M_y &amp;lt; \infty\]

&lt;hr /&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;이번 글에서는 이산 신호의 주기성과 대표적인 신호들인 임펄스 신호, 계단 신호, 그리고 지수 신호를 중심으로 다루었다. 특히, 지수 신호가 복소수일 때 오일러 공식을 통해 정현파로 표현된다는 점과 이산 신호의 주파수 및 주기성 조건을 이해하는 것이 중요한 포인트였다.&lt;/p&gt;

&lt;p&gt;또한, LTI 시스템의 개념과 임펄스 응답을 활용한 시스템 분석 방법을 살펴보며, 선형성과 시불변성, 그리고 BIBO 안정성을 통한 시스템 평가 기준도 정리하였다.&lt;/p&gt;

&lt;p&gt;이산 신호와 시스템은 단순해 보이지만, 실제로는 신호 처리의 기초를 이루는 중요한 개념이다. 이번 기회에 기본 개념들을 다시 정리하며, 앞으로 심화 학습에서 이를 기반으로 더욱 복잡한 주제를 이해하는 데 활용할 수 있을 것 같다.&lt;/p&gt;
</description>
                <pubDate>Fri, 24 Jan 2025 13:06:03 +0000</pubDate>
                <link>/discrete-signal-and-system</link>
                <guid isPermaLink="true">/discrete-signal-and-system</guid>
                
                <category>Signal Processing</category>
                
                
            </item>
        
            <item>
                <title>Fundamentals of digital signal processing</title>
                <description>&lt;p&gt;신호는 우리의 일상 속에서 항상 존재한다. 지금 이 글을 읽는 것도 모니터에서 나오는 빛이라는 신호가 눈에 입력되기 때문이며, 들리는 소리나 스마트폰의 무선 통신에서도 신호가 사용된다. 그러나 일상에서 관찰되는 신호는 아날로그 형태이기에, 컴퓨터로 처리하기 위해 디지털화가 필요하다. 이번 글에서는 디지털 신호 처리를 공부하기 위한 기본 개념을 위주로 살펴보려고 한다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;signal-and-system&quot;&gt;Signal and system&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;신호: 물리량의 변화 형태를 담은 자료/정보의 집합. 신호는 수학적으로는 &lt;strong&gt;함수&lt;/strong&gt;로 표현되는데 시간, 공간, 주파수 등이 독립 변수로서 사용된다.&lt;/li&gt;
  &lt;li&gt;시스템: 특정한 목적에 맞도록 주어진 신호를 조작하고 처리해내는 장치. 수학적으로는 하나 또는 여러 개의 &lt;strong&gt;방정식&lt;/strong&gt;으로 표현이 된다. (신호로부터 원하는 정보를 뽑아내는 역할)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;신호와 시스템을 효과적으로 표현하기 위해서 시각적인 표현을 사용한다. 먼저, 신호의 특성을 나타내기 위해 각 독립변수에 맞게 물리량이 어떻게 변화하는지를 그래프로 나타낸다. 그리고 이것을 ‘시간에 따른 값의 변화’ 파형이라고 부른다. 한편, 시스템을 나타낼 때는 블록 다이어그램을 활용한다. 시스템을 구성하는 작은 시스템인 부시스템을 사각 블록으로 나타내고 그 안에 이름 그리고 역할을 나타내는 수식이나 기호를 작성한다. (우측 그림)&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery gallery-column-2&quot;&gt;
    &lt;img src=&quot;/images/20250123_DSP/figure1.png&quot; loading=&quot;lazy&quot; /&gt;
    &lt;img src=&quot;/images/20250123_DSP/figure2.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;신호의 표현과 시스템의 블록 다이어그램&lt;/em&gt;
&lt;/div&gt;

&lt;p&gt;블록 다이어그램에서 시스템 간의 연결은 &lt;strong&gt;종속&lt;/strong&gt;과 &lt;strong&gt;병렬&lt;/strong&gt; 연결의 방식이 있으며, 종속 연결의 특수한 경우로 &lt;strong&gt;피드백연결&lt;/strong&gt;이 존재한다. 공부하면서 이것은 마치 딥러닝모델의 autoregressive 구조와 같다고 느껴졌다. 즉, 이전 시점의 출력을 다시 입력으로 사용하는 것이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;signal-processing&quot;&gt;Signal processing&lt;/h2&gt;

&lt;p&gt;신호에는 유용한 정보 뿐만 아니라 의도하지 않은 불필요한 정보들도 포함되어 있다. 따라서, 해당 신호에서 우리가 원하는 정보들만 추출해내고 용도에 맞게 변형하는 것이 중요하며 이것을 ‘신호 처리’라고 부른다. 일반적으로 신호처리의 작업은 크게 4종류로 분류된다: 해석, 합성, 변환, 필터링. 음성 신호를 처리하는데 있어서도 이 작업들을 적절히 조합하여 전처리 또는 후처리를 진행한다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;해석: 신호에서 의미있는 정보를 추출&lt;/li&gt;
  &lt;li&gt;합성: 새로운 신호를 생성&lt;/li&gt;
  &lt;li&gt;변환: 신호의 표현 방식 변경&lt;/li&gt;
  &lt;li&gt;필터링: 불필요한 신호 제거&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;classification-of-signal&quot;&gt;Classification of signal&lt;/h2&gt;

&lt;p&gt;신호는 기준에 따라 다양하게 분류할 수 있지만, 가장 보편적으로 분리하는 방법은 시간 축이 연속적인지 이산적인지에 따라 나뉘어진다. 연속적이라면 연속 시간 신호(continous time signal)이라고 하고, 이산적인 경우 이산 시간 신호(discrete time signal)이라고 한다. 기호로는 각각 $x(t)$와 $x[n]$ 으로 나타낸다.&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery gallery-column-2&quot;&gt;
    &lt;img src=&quot;/images/20250123_DSP/figure3.png&quot; loading=&quot;lazy&quot; /&gt;
    &lt;img src=&quot;/images/20250123_DSP/figure4.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;Continous time signal &amp;amp; Discrete time signal&lt;/em&gt;
&lt;/div&gt;

&lt;p&gt;아래에서 설명하겠지만, 이산신호와 연속신호의 특징을 표현하는 기호도 다르다. 연속시간 신호의 주파수는 소문자로 $f$ 라고 작성하지만, 이산시간 신호의 주파수는 $F$ 라고 나타내며 각주파수도 $\omega$와 $\Omega$ 로 다르다. 다른 표현을 보다보면 혼용해서 사용하는 경우도 종종 보이지만 엄밀히 말하자면 구분해서 사용하는 것이 맞다.&lt;/p&gt;

&lt;p&gt;어떻게 보면 연속시간 신호를 일정 구간마다 &lt;strong&gt;샘플링(sampling)&lt;/strong&gt;해서 이산적인 신호로 바라볼 수 있지만, 실제로 컴퓨터가 이것을 처리하기 위해서는 각 값에 해당하는 크기 역시 이산적이어야만 한다. 연속적인 그래프 위의 한 지점이 나타낼 수 있는 값은 사실상 무한하므로 마치 1.123456789를 1로 매핑하는 것과 같다. 이 과정을 우리는 &lt;strong&gt;양자화(quantization)&lt;/strong&gt;라고 한다.&lt;/p&gt;

&lt;!-- ![](/images/20250123_DSP/figure5.png){: width=60%}
*https://miing95.tistory.com/41* --&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;sinusoids&quot;&gt;Sinusoids&lt;/h2&gt;

&lt;p&gt;정현파는 신호와 시스템에서 가장 기본이 되는 신호로, 삼각함수인 사인과 코사인 함수로 정의된다. 정현파는 원 위를 운동하는 점을 시간축으로 풀어서 나타낸 것으로 아래 그림을 참고해보자:&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250123_DSP/figure6.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;https://engineeringslab.com/tutorial_electrical/phasor-representation-of-sinusoidal-quantities-1312.htm&lt;/em&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;진폭(amplitude, $A$): 정현파가 진동하는 크기를 나타내며, 운동하는 원의 반지름과 같다.-&lt;/li&gt;
  &lt;li&gt;주기(period, $T$): 공이 한 바퀴 도는데 걸리는 시간&lt;/li&gt;
  &lt;li&gt;주파수(frequency, $f$): 정현파가 1초에 몇 번 진동하는지&lt;/li&gt;
  &lt;li&gt;각 주파수(radian frequency, $\omega$): 1초동안 원의 호를 얼마나 움직이는지 - 초당 회전 각도.&lt;/li&gt;
  &lt;li&gt;위상(phase, $\phi$): 원 운동의 시작 지점&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;위 개념 중 주기, 각주파수, 주파수는 아래의 관계를 가지고 있다:&lt;/p&gt;

\[T= \frac{1}{f}=\frac{2\pi}{\omega}\]

&lt;p&gt;하나의 정현파를 정의하기 위해서 위 개념들을 이용하여 $x(t) = A\cos(\omega t + \phi)$ 로 작성한다. 처음 공부를 진행하면서 위상이라는 개념이 잘 와닿지 않았는데, 이는 신호를 얼마나 늦춰서 시작시킬 것인지에 대한 것으로 이해해볼 수 있다. 그렇기 때문에 기존 1초에 움직이는 거리를 radian 단위로 나타낸 $\omega$ 를 얼마나 늦춰서 시작할 것인지 $\omega t$ 로 대응시켜서 나타낼 수 있다. 아래는 주어진 정현파를 수식으로 나타내는 예제이다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250123_DSP/figure7.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;em&gt;주어진 그래프 신호를 보고, 정현파를 함수식으로 작성하는 예제&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;energy-and-power&quot;&gt;Energy and power&lt;/h2&gt;

&lt;p&gt;신호의 특성을 정량적으로 나타내고자 할 때, 신호를 대표하는 값으로 에너지(energy)와 전력(power) 그리고 실횻값(RMS value)를 사용할 수 있다. 각각의 정의는 다음과 같다:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;에너지: 전체 구간에 대해 신호 크기의 제곱을 적분 또는 더한 것&lt;/p&gt;

\[\lim_{T \rightarrow \infty} \int_{-\frac{T}{2}}^{\frac{T}{2}}|x(t)|^2 dt \qquad \lim_{N \rightarrow \infty}\sum_{n=-N}^{N}|x[n]|^2\]
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;전력: 신호의 에너지에 대해 평균을 계산한 값&lt;/p&gt;

\[\lim_{T \rightarrow \infty} \frac{1}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}|x(t)|^2 dt \qquad \lim_{N \rightarrow \infty} \frac{1}{2N + 1}\sum_{n=-N}^{N}|x[n]|^2\]
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;실횻값: 에너지 관저에서 신호의 실제적 효과를 나타낸 값. (전력의 제곱근)&lt;/p&gt;

\[\sqrt{\lim_{T \rightarrow \infty} \frac{1}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}|x(t)|^2 dt} \qquad \sqrt{\lim_{N \rightarrow \infty} \frac{1}{2N + 1}\sum_{n=-N}^{N}|x[n]|^2}\]
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250123_DSP/figure8.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;em&gt;간단한 연속시간 신호에 대해 에너지와 전력을 구하는 예제&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;decibel&quot;&gt;Decibel&lt;/h2&gt;

&lt;p&gt;데시벨은 신호의 상대적인 크기를 나타내는 데 사용되는 단위이다. 데시벨을 계산할 때는 신호의 전력비에 대해서는 $10 \log$ 를 신호의 크기비에 대해서는 $20\log$ 를 취해야 한다. 상대적인 단위이기 때문에 비교할 대상이 필요한데, python을 사용해 음성 전처리를 진행할 때는 librosa에서 참조 reference 에너지를 정의하여 사용하고 있다. (예: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ref=np.max&lt;/code&gt;)&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250123_DSP/figure9.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;Decibel 예제&lt;/em&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;이번 글에서는 신호와 시스템의 기본 개념을 살펴보았다. 신호는 정보를 담은 함수로, 시간, 공간, 주파수와 같은 독립 변수를 기준으로 물리량의 변화를 나타낸다. 이러한 신호를 처리하는 시스템은 수학적으로 방정식으로 표현되며, 신호를 조작하거나 필요한 정보를 추출하는 역할을 한다.&lt;/p&gt;

&lt;p&gt;특히 여러가지 신호들 중 정현파는 신호와 시스템의 가장 기본이 되는 단위로 진폭, 주기, 주파수, 각 주파수, 위상과 같은 요소로 정의된다. 이러한 정현파를 통해 신호의 주기성과 시간 변화 특성을 분석하는 것이 가능해졌다. 그 외에 신호의 특성을 나타낼 수 있는 에너지와 전력 그리고 데시벨(dB)에 대해서 살펴보았다.&lt;/p&gt;
</description>
                <pubDate>Thu, 23 Jan 2025 11:59:00 +0000</pubDate>
                <link>/fundamentals-of-digital-signal-processing</link>
                <guid isPermaLink="true">/fundamentals-of-digital-signal-processing</guid>
                
                <category>Signal Processing</category>
                
                
            </item>
        
            <item>
                <title>Discrete Time Fourier Transfrom (DTFT)</title>
                <description>&lt;blockquote&gt;
  &lt;p&gt;Discrete Time Fourier Transform은 이산 신호를&lt;br /&gt;
주파수 영역의 신호로 변환하는 도구이다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;우리 주변의 신호는 음성, 음악 그리고 디지털 영상 등 다양한 형태로 존재한다. 이러한 신호를 분석하고 처리하는데 있어 주파수 영역에서의 표현은 매우 중요하게 작용한다. 특히, 디지털 신호 처리에서 이산 신호를 다루기 위해 Discrete Time Fourier Transform (DTFT)라는 강력한 도구가 사용된다. 이 글에서는 DTFT를 이해하기 위해 필요한 기본 개념부터 차근차근 살펴보려고 한다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;discrete-time-signal&quot;&gt;Discrete Time Signal&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250121_DTFT/figure1.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;em&gt;https://www.javatpoint.com/discrete-time-signals-in-discrete-mathematics&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;이산 신호란 연속 신호와 달리 특정 시간 간격에서만 정의되는 신호를 말한다. 예를 들어, 디지털 오디오 데이터는 샘플링된 이산 신호의 대표적인 예이다. 이산 신호는 수식으로 보통 $x[n]$과 같은 형태로 표현되며, 여기서 $n$은 정수로 나타내는 시간 축의 인덱스를 의미한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;discrete-time-fourier-series-dtfs&quot;&gt;Discrete Time Fourier Series (DTFS)&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;/fourier-series-and-fourier-transform&quot;&gt;이전글&lt;/a&gt;에서 살펴본 것 처럼, Fourier Series는 주기적인 신호를 주파수 영역의 기본 조화파들의 합으로 표현하는 방법이다. 이를 수식으로 나타내면 다음과 같다:&lt;/p&gt;

\[x[n] = \sum_{k=0}^{N-1} X[k] \cdot e^{j \frac{2\pi}{N} kn}\]

&lt;ul&gt;
  &lt;li&gt;$x[n]$: 주기 이산 신호&lt;/li&gt;
  &lt;li&gt;$X[k]$: $x[n]$ 의 DTFS 계수, 즉 해당 주파수 성분의 크기와 위상 정보&lt;/li&gt;
  &lt;li&gt;$N$: 신호의 주기&lt;/li&gt;
  &lt;li&gt;$k$: 이산 주파수 인덱스&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;주기를 가지는 이산신호는 $N$개의 값들이 반복되므로, 주파수를 표현할 때 원 한 바퀴($2\pi$)를 $N$으로 나누어 작성한다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;dtfs-coefficient의-유도&quot;&gt;DTFS Coefficient의 유도&lt;/h3&gt;

&lt;p&gt;복소 지수 함수의 직교 성질을 활용해 각 주파수 성분의 계수 $X[k]$를 유도할 수 있다. 두 복소지수 함수 $e^{j \frac{2\pi}{N} kn}$과 $e^{j \frac{2\pi}{N} mn}$의 내적을 계산하면:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;$m \neq k$: $\sum_{n=0}^{N-1} e^{j \frac{2\pi}{N} (k-m)n} = 0$&lt;/li&gt;
  &lt;li&gt;$m = k$: $\sum_{n=0}^{N-1} e^{j \frac{2\pi}{N} (k-m)n} = N$&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이를 기반으로 각 주파수 성분의 크기를 다음과 같이 계산할 수 있다:&lt;/p&gt;

\[X[k] = \frac{1}{N} \sum_{n=0}^{N-1} x[n] \cdot  e^{-j\frac{2\pi}{N}kn}\]

&lt;hr /&gt;

&lt;h2 id=&quot;discrete-time-fourier-transform-dtft&quot;&gt;Discrete Time Fourier Transform (DTFT)&lt;/h2&gt;

&lt;p&gt;DTFS는 주기적인 이산 신호를 분석하는 데 사용된다. 그렇다면 주기가 없는 이산 신호는 어떻게 분석할 수 있을까? 여기서 DTFT가 등장한다. 주기 신호의 주기를 무한대로 확장하면 $N \rightarrow \infty$가 되고, 주파수 인덱스 $k$는 연속 주파수 $\omega$로 변환된다. 이때 DTFT는 다음과 같이 정의된다:&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

\[\lim_{N \rightarrow \infty} X[n] = \lim_{N \rightarrow \infty} \frac{1}{N} \sum_{n=0}^{N-1} x[n] \cdot e^{-j\frac{2\pi}{N} kn}\]

\[X(e^{j\omega}) = \sum_{n=-\infty}^{\infty} x[n]\cdot e^{-j\omega n}\]

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;여기서 $X(e^{j\omega})$는 연속 주파수 $\omega$에 대한 주파수 성분을 나타낸다. DTFT는 모든 시간 축에서의 신호 $x[n]$의 정보를 주파수 영역으로 변환하며, 이를 통해 신호의 주파수 특성을 확인할 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;주파수 대역에서의 주기성&lt;/strong&gt;&lt;br /&gt;
DTFT는 주파수 대역에서 주기성을 갖는다. 이는 $X(e^{j\omega})$가 $\omega + 2\pi$에서 반복되는 성질에서 확인할 수 있다.&lt;/p&gt;

\[X(e^{j(\omega + 2\pi)}) = \sum_{n=-\infty}^{\infty} x[n] \cdot e^{-j(\omega + 2\pi) n} = X(e^{j\omega})\]

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;inverse-discrete-time-fourier-transform-idtft&quot;&gt;inverse Discrete Time Fourier Transform (iDTFT)&lt;/h2&gt;

&lt;p&gt;DTFT의 역변환은 주파수 영역의 정보를 시간 영역으로 복원하는데 사용된다. 이를 위해 DTFS의 식에서 시작해 리만 합을 적용하면 다음과 같이 유도된다:&lt;/p&gt;

\[\begin{aligned}
x[n] &amp;amp;= \sum_{k=&amp;lt;N&amp;gt;}X[k] e^{j\frac{2\pi}{N}kn} \\
&amp;amp;= \frac{1}{2\pi} \sum_{k=&amp;lt;N&amp;gt;} N\cdot X[k] \cdot e^{j\frac{2\pi}{N}kn} \cdot \frac{2\pi}{N}
\end{aligned}\]

&lt;p&gt;위 식에서 복소 지수 함수의 $\frac{2\pi}{N}k$ 는 연속적인 값인 $\omega$ 로 변화하고, 가장 마지막 $\frac{2\pi}{N}$ 역시 미소변화량 $\Delta \omega$ 로 바뀐다. 이는 리만합과 같아져 전체 구간에 대한 적분으로 해석할 수 있게 된다.&lt;/p&gt;

\[\therefore x[n] = \frac{1}{2\pi} \int_{-\infty}^{\infty} X(e^{j\omega}) e^{j\omega n} d\omega\]

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery&quot;&gt;
    &lt;img src=&quot;/images/20250121_DTFT/figure2.png&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;여기서 $X(e^{j\omega})$는 주파수 성분, $e^{j\omega n}$는 복원할 시간 축의 정보를 포함한다. 이를 통해 DTFT를 통해 얻은 주파수 정보를 다시 시간 영역으로 변환할 수 있다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;example-dtft-of-a-cosine-signal&quot;&gt;Example: DTFT of a cosine signal&lt;/h3&gt;

&lt;p&gt;임의의 코사인 이산 신호 함수가 존재할 때, 여기에 푸리에 변환을 적용한 결과는 어떻게 나오는지 살펴보자. 미리 말하자면, 이번 예제의 목적은 주기신호의 DTFT 결과는 임펄스 함수로 표현됨을 보이기 위함이다.&lt;/p&gt;

\[\begin{aligned}
x[n] &amp;amp;= \cos (\omega_0 n) \\
&amp;amp;= \frac{1}{2}e^{j\omega_0 n} + \frac{1}{2}e^{-j\omega_0 n}
\end{aligned}\]

&lt;p&gt;오일러 공식에 의하면, 코사인 함수는 오직 2개의 정현파로만 구성되어 있어 2개의 주파수 성분만 가지고 있음을 볼 수 있다. iDTFT의 정의를 적용하여 그 때의 주파수는 $\pm \omega_0$ 일 때인 것을 도출하게 된다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/20250121_DTFT/figure3.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;em&gt;Dicrete Time Fourier Transform of a cosine signal&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;이번 글에서는 DTFT를 이해하기 위해 discrete time signal, discrete time fourier series에 대해서 알아보았다. Fourier series가 주기 신호를 분석하는데 사용된다면, Fourier transform은 비주기 신호를 DTFT는 이산 비주기 신호를 주파수 영역에서 분석하는데 사용이 된다. 또한, fourier coefficient 계수의 유도 과정을 조화파의 직교성을 활용하여 수식적으로 확인하였다.&lt;/p&gt;

&lt;p&gt;이러한 개념들은 디지털 신호 처리의 기본이 되며, 오디오 분석, 영상 처리, 그리고 통신 시스템등 다양한 분야에서 응용이 된다. DTFT는 단순한 수학적 정의를 넘어 우리가 일상에서 사용하는 디지털 기술의 핵심 원리를 설명해주는 매우 중요한 개념이라고 생각된다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;div class=&quot;gallery-box&quot;&gt;
  &lt;div class=&quot;gallery gallery-column-2&quot;&gt;
    &lt;img src=&quot;/images/20250121_DTFT/figure4.jpg&quot; loading=&quot;lazy&quot; /&gt;
    &lt;img src=&quot;/images/20250121_DTFT/figure5.jpg&quot; loading=&quot;lazy&quot; /&gt;
  &lt;/div&gt;
  &lt;em&gt;DTFT 필기 내용&lt;/em&gt;
&lt;/div&gt;
</description>
                <pubDate>Tue, 21 Jan 2025 12:24:30 +0000</pubDate>
                <link>/discrete-time-fourier-transfrom</link>
                <guid isPermaLink="true">/discrete-time-fourier-transfrom</guid>
                
                <category>Signal Processing</category>
                
                
            </item>
        
    </channel>
</rss>