วิธีที่เหมาะสมในการสุ่มตัวอย่าง 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
ดังนั้นเราจึงดูแล 2 กรณีที่นี่:
- Upsample
เราเพิ่มศูนย์ตัวอย่างลงในส่วนตรงกลางของDFTเพื่อให้ตรงกับจำนวนตัวอย่างของเอาต์พุต (numSamplesO
)
เราดูแลในกรณีที่จำนวนอินพุตของตัวอย่าง (numSamples
) เท่ากัน ในกรณีนั้นเราแยกตัวอย่าง Nyquist ($ X \left[ N / 2 \right] $) เป็น 2 โดยที่ $ N $ คือจำนวนตัวอย่างที่ป้อนเข้า - Downsample
เราลบตัวอย่างของส่วนตรงกลางของDFTเพื่อให้ตรงกับจำนวนตัวอย่างของเอาต์พุต (numSamplesO
)
เราดูแลในกรณีที่จำนวนเอาต์พุตของตัวอย่าง (numSamplesO
) เท่ากัน ในกรณีนั้นเราแบ่งตัวอย่างเป็น Nyquist ($ X \left[ M / 2 \right] $) เป็น 2 โดยที่ $ M $ คือจำนวนตัวอย่างที่ส่งออก
คำถามคือทำไมเราถึงทำแบบนี้? ทำไมต้องเป็นปัจจัยการแก้ไขinterpFactor
? ปัจจัยการแยกของ$ 0.5 $มาจาก?
เพื่อตอบว่าเราต้องจำ DFT นั้นโดยพื้นฐานแล้วคือ Discrete Fourier Series (DFS)
ซึ่งหมายความว่าสมมติฐานที่สำคัญที่สุดคือข้อมูลที่เป็นระยะทั้งในโดเมนเวลาและความถี่
ตอนนี้เนื่องจากDFTนั้นโดยพื้นฐานแล้วDFSวิธีที่เป็นธรรมชาติในการแก้ไขสัญญาณภายในช่วงเวลานั้นคือการใช้ Fourier Series
ก่อนที่จะลงรายละเอียดให้กำหนดจำนวนเต็ม 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} $ สุ่มตัวอย่างโดย Sampling Theorem สำหรับ $ 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 $ เสื้อ = 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} $. จากนั้นจะเห็นการเชื่อมต่อกับต้นกำเนิดDiscrete Fourier Series ( DFS ) ของDFTได้ง่ายขึ้น
หมายเหตุ : ในทางปฏิบัติ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} $$
ซึ่งสิ่งที่เราทำในupsampleโค้ดข้างต้น
แล้ว downsample ล่ะ? เราสามารถใช้สัญชาตญาณเดียวกันในโดเมนDFTตามที่โค้ดแสดง โดยพื้นฐานแล้วเป็นเพราะการแก้ไขโดยใช้ค่าสัมประสิทธิ์ของฟูเรียร์ซีรีส์นั้นไม่มีอะไรนอกจากการคูณในโดเมนความถี่โดยเคอร์เนล Dirichlet ซึ่งเทียบเท่าเป็นระยะของ$ \operatorname{sinc} \left( \cdot \right) $ฟังก์ชัน นี่เป็นสัญชาตญาณสำหรับไฟล์$ \frac{1}{2} $เมื่อเราคูณด้วย rectagle ด้วยค่า 1 ที่โดเมนความถี่ซึ่งมีความไม่ต่อเนื่องในการกระโดด ซีรีส์ฟูเรียร์ที่แท้จริงมาบรรจบกับค่าเฉลี่ยของการกระโดดเมื่อไม่ต่อเนื่อง ตั้งแต่เราไป$ 1 $ ถึง $ 0 $ก็หมายความว่าค่าที่กระโดดคือ $ 0.5 $.
ดังนั้นโค้ด downsmaplign และ upampling ด้านบนจึงใช้ Dirichlet Kernel กับข้อมูลตามความถี่การสุ่มตัวอย่างของอินพุตในกรณี upsample และเอาต์พุตในกรณี downsample
อีกวิธีหนึ่งในการลดตัวอย่างจะเป็นการเพิ่มการสุ่มตัวอย่างเป็นจำนวนเต็มของจำนวนตัวอย่างที่ส่งออก จากนั้นใช้ decimation (ใช้ทุก ... ตัวอย่าง) เพื่อรับตัวอย่าง 2 จะจับคู่สำหรับกรณีที่ข้อมูลไม่มีพลังงานในความถี่ระหว่างอัตราต่ำและอัตราสุ่มตัวอย่าง หากเป็นเช่นนั้นก็จะไม่ตรงกัน
ฉันจะเพิ่ม MATLAB Code ...
หมายเหตุ : คำตอบนี้ครอบคลุมถึงUpsamplingด้วย โปรดพิจารณาเปิดคำถามอื่นเกี่ยวกับUpsamplingหรือขยายคำถามนี้