샘플 수가 한정된 균일하게 샘플링 된 이산 신호에 대해 Sinc Downsampling (DFT Downsampling)을 수행하는 올바른 방법
주어진 신호 $ \left\{ x [ 0 ], x [ 1 ], ..., x [ N - 1 ] \right\} $ 주파수 영역 (Sinc 보간)에서 다운 샘플링하는 올바른 방법은 무엇입니까?
답변
주파수 보간 (DFT 도메인)
구현은 잘 알려져 있습니다. MATLAB에서는 다음과 같습니다.
if(numSamplesO > numSamples)
% Upsample
halfNSamples = numSamples / 2;
if(mod(numSamples, 2) ~= 0) % Odd number of samples
vXDftInt = interpFactor * [vXDft(1:ceil(halfNSamples)); zeros(numSamplesO - numSamples, 1, 'like', vXDft); vXDft((ceil(halfNSamples) + 1):numSamples)];
else % Even number of samples -> Special Case
vXDftInt = interpFactor * [vXDft(1:halfNSamples); vXDft(halfNSamples + 1) / 2; zeros(numSamplesO - numSamples - 1, 1, 'like', vXDft); vXDft(halfNSamples + 1) / 2; vXDft((halfNSamples + 2):numSamples)];
end
else
% Downsample
halfNSamples = numSamplesO / 2;
if(mod(numSamples, 2) ~= 0) % Odd number of samples
vXDftInt = interpFactor * [vXDft(1:ceil(halfNSamples)); vXDft((numSamples - floor(halfNSamples) + 1):numSamples)];
else % Even number of samples -> Special Case
vXDftInt = interpFactor * [vXDft(1:halfNSamples); vXDft(halfNSamples + 1) / 2; vXDft((numSamples - halfNSamples + 2):numSamples)];
end
end
그래서 우리는 여기서 두 가지 경우를 처리합니다.
- 업 샘플 출력의 샘플 수 ( ) 와 일치하도록 DFT
의 중앙 부분에 0 개 샘플을 추가합니다 . 입력 된 샘플 개수 ( )가 짝수 인 경우를 처리합니다. 이 경우 Nyquist 샘플 (numSamplesO
numSamples
$ X \left[ N / 2 \right] $) 2로 $ N $ 입력 샘플 수입니다. - 다운
샘플 출력의 샘플 수 ( ) 와 일치하도록 DFT 중앙 부분의 샘플을 제거합니다numSamplesO
.
출력 샘플 개수 (numSamplesO
)가 짝수 인 경우를 처리합니다. 이 경우 Nyquist 샘플 ($ X \left[ M / 2 \right] $) 2로 $ M $ 샘플의 출력 수입니다.
문제는 왜 우리가 이런 식으로 하는가? 왜 보간 인자 interpFactor
인가? 분할 요인은 어디에 있습니까?$ 0.5 $에서 왔습니까?
이에 답하기 위해 DFT는 기본적으로 DFS (Discrete Fourier Series)라는 것을 기억해야합니다.
즉, 가장 중요한 가정은 데이터가 시간 및 주파수 영역에서 주기적이라는 것입니다.
이제 DFT 는 기본적으로 DFS 이므로 해당주기 내에서 신호를 보간하는 자연스러운 방법은 푸리에 시리즈를 사용하는 것입니다.
자세히 알아보기 전에 인덱스 값을 정의하는 데 사용할 정수 2 세트를 정의 해 보겠습니다.
$$ \begin{aligned} \mathcal{K}_{DFS}^{N} & = \left\{- \left\lceil \frac{N - 1}{2} \right\rceil, - \left\lceil \frac{N - 1}{2} \right\rceil + 1, \ldots, -1, 0, 1, \ldots, \left\lceil \frac{N - 1}{2} \right\rceil - 1, \left\lceil \frac{N - 1}{2} \right\rceil \right\} \\ \mathcal{K}_{DFT}^{N} & = \left\{- \left\lceil \frac{N - 1}{2} \right\rceil, - \left\lceil \frac{N - 1}{2} \right\rceil + 1, \ldots, -1, 0, 1, \ldots, \left\lceil \frac{N - 1}{2} \right\rceil - 1, \left\lfloor \frac{N - 1}{2} \right\rfloor \right\} \\ \end{aligned} $$
즉, 최대 대역폭이 다음과 같은 신호의 경우 $ \frac{1}{2 T} $ 샘플링 정리에 의해 샘플링 된 $ t \in \left[ 0, N T \right) $ 어디 $ T $ 샘플링 기간이며 $ P = N T $ 기능 기간 :
$$ \begin{aligned} x \left( t \right) {\Big|}_{t = n T} & = \sum_{k = - \left\lceil \frac{N - 1}{2} \right\rceil}^{\left\lceil \frac{N - 1}{2} \right\rceil} {c}_{k} {e}^{ j 2 \pi \frac{k t}{P} } && \text{By Fourier Series} \\ & = \sum_{k = - \left\lceil \frac{N - 1}{2} \right\rceil}^{\left\lceil \frac{N - 1}{2} \right\rceil} {c}_{k} {e}^{ j 2 \pi \frac{k t}{N T} } && \text{By the period of the function / series} \\ & = \sum_{k = - \left\lceil \frac{N - 1}{2} \right\rceil}^{\left\lceil \frac{N - 1}{2} \right\rceil} {c}_{k} {e}^{ j 2 \pi \frac{k n}{N} } && \text{Setting $ t = n T $} \\ & = \frac{1}{N} \sum_{k = - \left\lceil \frac{N - 1}{2} \right\rceil}^{\left\lfloor \frac{N - 1}{2} \right\rfloor} X \left[ k \right] {e}^{ j 2 \pi \frac{k n}{N} } && \text{The DFT} \end{aligned} $$
위의 공식은 짝수 경우에 적용됩니다. $ N = 2 l, \; l \in \mathbb{N} $ 그리고 이상한 경우 $ N = 2 l + 1, \; l \in \mathbb{N} $. 위는 DFT 계수와 푸리에 시리즈 계수 간의 연결을 정의합니다 .
$$ {c}_{k} = \begin{cases} \frac{ X \left[ k \right ] }{2 N} & \text{ if } k = \frac{N}{2} \\ \frac{ X \left[ k \right ] }{2 N} & \text{ if } k = -\frac{N}{2} \\ \frac{ X \left[ k \right ] }{N} & \text{ if } k \notin \left\{\frac{N}{2}, -\frac{N}{2} \right\} \end{cases}, \; k \in \mathcal{K}_{DFS}^{N} $$
그러나 어떤 세트에 대해서도 다른 샘플링 포인트를 사용하는 것을 막을 수는 없습니다. $ { \left\{ {t}_{m} \right\}}_{m = 0}^{M - 1} $ 어디 $ \forall m, {t}_{m} \in \left[ 0, N T \right) $. 주는$ x \left( t \right) = \frac{1}{N} \sum_{k = - \left\lceil \frac{N - 1}{2} \right\rceil}^{\left\lfloor \frac{N - 1}{2} \right\rfloor} X \left[ k \right] {e}^{ j 2 \pi \frac{k t}{N T} } $ ...에 대한 $ t \in \left[ 0, N T \right) $. 이것은 복잡하고 실제 신호에 대해 작동합니다.
실제 신호의 경우$ x \left( t \right) \in \mathbb{R} $코사인 형식의 DFT를 사용할 수도 있습니다 .
$$ \begin{aligned} x \left( t \right) & = \sum_{k = - \left\lceil \frac{N - 1}{2} \right\rceil}^{\left\lceil \frac{N - 1}{2} \right\rceil} {c}_{k} {e}^{ j 2 \pi \frac{k t}{N T} } && \text{From the above} \\ & = \sum_{k = - \left\lceil \frac{N - 1}{2} \right\rceil}^{\left\lceil \frac{N - 1}{2} \right\rceil} \left| {c}_{k} \right| \cos \left( 2 \pi \frac{k t}{N T} + \angle {c}_{k} \right) && \text{Fourier series in its Cosine form} \\ & = \sum_{k = - \left\lceil \frac{N - 1}{2} \right\rceil}^{\left\lfloor \frac{N - 1}{2} \right\rfloor} \frac{\left| X \left[ k \right] \right|}{N} \cos \left( 2 \pi \frac{k t}{N T} + \angle X \left[ k \right] \right) && \text{Fourier series in its Cosine form} \\ & = \sum_{k = 0}^{\left\lfloor \frac{N - 1}{2} \right\rfloor} {\alpha}_{k} \frac{\left| X \left[ k \right] \right|}{N} \cos \left( 2 \pi \frac{k t}{N T} + \angle X \left[ k \right] \right) && \text{Using the DFT conjugate symmetry of a real signal} \end{aligned} $$
어디 $ {\alpha}_{k} = \begin{cases} 1 & \text{ if } k \in \left\{ 0, \frac{N}{2} \right\} \\ 2 & \text{ else } \end{cases} $.
이제 우리는 여기서 본 것과 그것이 위의 알고리즘과 어떤 관련이 있는지 생각해야합니다.
먼저 여기서 주요 트릭은 DFT 의 기본 형식 이 인덱스가 될 때$ k \in \mathcal{K}_{DFT}^{N} $. 그러면 DFT 의 DFS ( Discrete Fourier Series ) 원점에 대한 연결을 더 쉽게 볼 수 있습니다.
비고 : 실제로 DFT 는 다음과 같이 정의 (및 계산)됩니다.$ k \in \left\{ 0, 1, \ldots, N - 1 \right\} $.
출력 균일 시간 그리드 세트를 선택하면 $ { \left\{ {t}_{m} \right\}}_{m = 0}^{M - 1} $ 형태로 $ {t}_{m} = m {T}_{s} $ 업 샘플링 속도 (나중에 다운 샘플링 처리) $ q = \frac{M}{N} \geq 1 $그리드를 복구하기 위해 IDFT 를 살펴보면 무엇을해야하는지 분명 합니다.
$$ x \left[ m \right] = \frac{1}{M} \sum_{k = 0}^{M - 1} \tilde{X} \left[ k \right] {e}^{j 2 \pi \frac{k m}{M}} = \frac{1}{M} \sum_{k = - \left\lceil \frac{M - 1}{2} \right\rceil}^{\left\lfloor \frac{M - 1}{2} \right\rfloor} \tilde{X} \left[ k \right] {e}^{j 2 \pi \frac{k m}{M}} $$
이제 우리는 이것을 위에서 보간 공식과 일치시켜야합니다. 선형 변환이므로 곱하기$ q $상수를 처리합니다. 우리는 또한$ \forall m, \frac{m}{M} = \frac{{t}_{m}}{N T} $ 따라서 다음을 설정하여 :
$$ \tilde{X} \left[ k \right] = \begin{cases} X \left[ k \right] & \text{ if } k \in \mathcal{K}_{DFT}^{N} \setminus \left\{ k \mid k = \frac{N}{2} \right\} \\ \frac{X \left[ k \right]}{2} & \text{ if } k = \frac{N}{2} \\ 0 & \text{ if } k \notin \mathcal{K}_{DFT}^{N} \end{cases} $$
로부터 $ N $ DFT의 주기성 우리는 보간 계수가 다음과 같은 균일 한 시간 격자에 대한 최종 보간을 작성할 수 있습니다. $ q $:
$$ x \left[ m \right] = \frac{q}{M} \sum_{k = 0}^{M - 1} \hat{X} \left[ k \right] {e}^{j 2 \pi \frac{k m}{M}} $$
어디 $ \hat{X} \left[ k \right] $ 다음과 같이 정의됩니다.
$$ \hat{X} \left[ k \right] = \begin{cases} X \left[ k \right] & \text{ if } k \in \left\{ 0, 1, \ldots, N - 1 \right\} \setminus \left\{ \frac{N}{2} \right\} \\ \frac{X \left[ k \right]}{2} & \text{ if } k = \frac{N}{2} \\ 0 & \text{ if } k \in \left\{ N, N + 1, \ldots, M - 1 \right\} \end{cases} $$
위 의 업 샘플 코드 에서 정확히 무엇을했는지 .
다운 샘플은 어떻습니까? 글쎄, 우리는 코드가 보여주는 것처럼 DFT 도메인 에서 동일한 직관을 사용할 수 있습니다 . 이것은 기본적으로 푸리에 시리즈 계수를 사용하는 보간은 주파수 영역에서 주기적 등가 인 Dirichlet 커널에 의한 곱셈이기 때문입니다.$ \operatorname{sinc} \left( \cdot \right) $함수. 이것은 또한 직감입니다$ \frac{1}{2} $인자, 점프 불연속성 이있는 주파수 영역에서 값 1을 가진 rectagle과 곱 합니다. 실제로 푸리에 급수는 불연속 점프의 평균값에 수렴합니다. 우리가 갔기 때문에$ 1 $ ...에 $ 0 $, 그것은 점프에서의 값이 $ 0.5 $.
따라서 위의 다운스 맵 라인 및 업 샘플링 코드는 업 샘플의 경우 입력, 다운 샘플의 경우 출력의 샘플링 주파수에 따라 Dirichlet Kernel을 데이터에 적용합니다.
다운 샘플링하는 또 다른 방법은 출력 샘플 수의 정수 인자로 업 샘플링하는 것입니다. 그런 다음 데시 메이션 (Take every ... sample)을 사용하여 샘플을 가져옵니다. 2는 데이터가 낮은 속도와 샘플링 속도 사이의 주파수에 에너지가없는 경우에 일치합니다. 일치하면 일치하지 않습니다.
MATLAB 코드를 추가하겠습니다.
비고 :이 답변은 업 샘플링 도 다룹니다 . 업 샘플링에 대한 다른 질문을 여는 것을 고려 하거나이 질문을 넓히십시오.