You are on page 1of 32

Digital Signal Processing

alghoniemy@alexu.edu.eg

10/15/2022 1
• Reading:

• Oppenheim:
– Sections: 9.3, 9.4,

• Proakis:
– Sections: 6.1.3, 6.1.4, 6.2.1, 6.2.2

10/15/2022 2
The Discrete Fourier Transform
X N = FN x N
 X [0]  1 1 1 ... 1   x[0] 
 X [1]  1 W W 2
... WNN −1   x[1] 
   N N  
 X [2]  = 1 WN2 WN4 ... WN2 ( N −1)   x[2] 
    
 :  : : : ... :  : 
 X [ N − 1] 1 WNN −1 WN2 ( N −1) WN( N −1)   x[ N − 1]
2

• Direct computation of 𝑁-point DFT requires


𝑁 2 complex multiplications + 𝑁(𝑁 − 1) complex additions

• The complexity of the DFT is in the order of 𝓞(𝑵𝟐 ) “too high”

• Memory storage: we need to store 𝑵𝟐 complex coefficients 𝑊𝑁𝑛𝑘


10/15/2022 3
Factorization of the DFT matrix

• example: rearrange the even-odd columns of the 4-point DFT matrix

1 1 1 1 
1 − j − 1 j 
F4 =  
1 − 1 1 − 1
 
1 j − 1 − j 
• Define the permutation matrix 𝐏𝟒

1 1 1 1  1  1 1 1 1
1 − j −1 j   1  1 −1 − j j 
Fˆ 4 = F4P4T =   = 
1 −1 1 −1  1  1 1 −1 −1
    
1 j −1 − j   1 1 −1 j − j 
10/15/2022 4
Factorization of the DFT matrix

• 1 1 1 1
1 −1 − j j 
Fˆ 4 = F4P4T =  
1 1 −1 −1
 
1 −1 j − j 
 1 1   1 0  1 1  
   0 − j  1  
− −1    F2
ˆF =      D 2F2 
1 1
=
1 1  −D 2F2 
4
    −1 0  1 1     F2
 
 1 −1   0 j  1
  
−1  
where

1 1   1 0  W 0
0
F2 =   , D2 =   = 4
1
10/15/2022 1 −1 0 − j   0 W4  5
Factorization of the DFT matrix

• Note that: I 4 = P4T P4 (why ?)

• We need to find:
y = F4x
y = ( F4P4T )( P4x )
 y L  ˆ  x even 
 y  = F4  x 
 U  odd 
• The 4-DFT becomes

 x   F D 2F2   x even 
F4x = Fˆ 4  even
=
 F
2

 odd   2
x −D 2F2   x odd 

One 4-point DFT can be computed using two 2-point DFTs


10/15/2022 6
• example: consider the 8-point DFT matrix
W80 W80 W80 W80 W80 W80 W80 W80 
 0 
W8 W81 W82 W83 W84 W85 W86 W87 
W80 W82 W84 W86 W80 W82 W84 W86 
 0 
W83 W86 W81 W84 W87 W82 W85 
F8 =  80
W
W8 W84 W80 W84 W80 W84 W80 W84 
 0 5 2 7 4 1 6 3
W8 W8 W8 W8 W8 W8 W8 W8 
W 0 W86 W84 W82 W80 W86 W84 W82 
 80 
W8 W8 W8 W8 W8 W8 W8 W8 
7 6 5 4 3 2 1

• Group the even-odd columns


W80 W80 W80 W80 W80 W80 W80 W80 
 0 
W8 W82 W84 W86 W81 W83 W85 W87 
W80 W84 W80 W84 W82 W86 W82 W86 
 0 
W86 W84 W82 W83 W81 W87 W85 
Fˆ8 =  80
W
W8 W80 W80 W80 W84 W84 W84 W84 
 0 
W8 W82 W84 W86 W85 W87 W81 W83 
W 0 W84 W80 W84 W86 W82 W86 W82 
 80 
10/15/2022 W8 W86 W84 W82 W87 W85 W83 W81  7
• Consider the twiddle factor properties
W80 = 1, W84 = −1, W82 = − j, W86 =j

1 1 1 1 1 1 1 1
1 −𝑗 −1 𝑗 𝑊81 −𝑗𝑊81 −𝑊81 𝑗𝑊81
1 −1 1 −1 −𝑗 𝑗 −𝑗 𝑗
෠ 1 𝑗 −1 −𝑗 −𝑗𝑊81 𝑊81 𝑗𝑊81 −𝑊81
𝐅8 =
1 1 1 1 −1 −1 −1 −1
1 −𝑗 −1 𝑗 −𝑊81 𝑗𝑊81 𝑊81 −𝑗𝑊81
1 −1 1 −1 𝑗 −𝑗 𝑗 −𝑗
1 𝑗 −1 −𝑗 𝑗𝑊81 −𝑊81 −𝑗𝑊81 𝑊81

• Define the diagonal matrix 𝑫𝟒


𝑊80
𝑊81
𝐃4 =
𝑊82
𝑊83

10/15/2022 8
 1 1 11  W80  1 1 1 1   
   1 − j −1 j   
 1 − j −1 j  1
  W8    
 1 −1 1 −1  W82
 1 −1 1 −1  
   3    
 1 j −1 − j   1 j −1 − j   
 W8 
Fˆ8 = 
 1 1 11  W80  1 1 1 1   
 1    1 − j −1 j   
− j −1 j  −
1
  W8    
 1 −1 1 −1   W82  1 −1 1 −1  
 1    3    
j −1 − j   1 j −1 − j   
   W8 

 F4 D 4F4 
Fˆ8 =
 F4 −D 4F4  The 8-point DFT can be computed as

 yL  ˆ  x   F D 4F4   x even 
y  = = 8
even
=
 F
4

−D 4F4   x odd 
F8 x F
 U  odd   4
x

An 8-point DFT can be computed as TWO 4-point DFTs


10/15/2022 9
• example: compute the 8-point DFT of the sequence x?
• apply column permutation 𝐱 𝑒𝑣𝑒𝑛
𝐲 = 𝐅8 𝐱 = 𝐅8 𝐏𝐓 𝐏 ෠
𝐱 = 𝐅8 𝐱
𝑜𝑑𝑑

• DFT factorization 𝐅4 𝐃4 𝐅4 𝐱 𝑒𝑣𝑒𝑛


𝐲=
𝐅4 −𝐃4 𝐅4 𝐱 𝑜𝑑𝑑

𝐅4 𝐱 𝑒𝑣𝑒𝑛 + 𝐃4 𝐅4 𝐱 𝑜𝑑𝑑
=
𝐅4 𝐱 𝑒𝑣𝑒𝑛 − 𝐃4 𝐅4 𝐱 𝑜𝑑𝑑
• another DFT factorization

𝐅 𝐃2 𝐅2 𝐱 𝑒𝑣𝑒𝑛/𝑒𝑣𝑒𝑛
𝐅4 𝐱 𝑒𝑣𝑒𝑛 = 2
𝐅2 −𝐃2 𝐅2 𝐱 𝑒𝑣𝑒𝑛/𝑜𝑑𝑑

𝐅 𝐃2 𝐅2 𝐱 𝑜𝑑𝑑/𝑒𝑣𝑒𝑛
𝐅4 𝐱 𝑜𝑑𝑑 = 2
𝐅2 −𝐃2 𝐅2 𝐱 𝑜𝑑𝑑/𝑜𝑑𝑑
• ends-up with a 2-point DFT
1 1 1 0
𝐅2 = , 𝐃2 =
1 −1 0 −𝑗
10/15/2022 10
Decimation in Time FFT (DIT-FFT)

• N-point DFT of the sequence 𝐱 can be computed as TWO N/2-point DFTs

𝐲𝐿 𝐅𝑁/2 𝐃𝑁/2 𝐅𝑁/2 𝐱 𝑒𝑣𝑒𝑛


𝐅𝑁 𝐱 = 𝐲 =
𝑈 𝐅𝑁/2 −𝐃𝑁/2 𝐅𝑁/2 𝐱 𝑜𝑑𝑑

𝐲𝐿 𝐈𝑁/2 𝐈𝑁/2 𝐅𝑁/2 𝐱 𝑒𝑣𝑒𝑛


Where: 𝐲𝑈 = 𝐈𝑁/2 −𝐈𝑁/2 𝐃𝑁/2 𝐅𝑁/2 𝐱𝑜𝑑𝑑

WN0 
 1 
W
D N /2 = N 
 
 N /2 −1 
 WN 

10/15/2022 11
8-point DIT-FFT is reduced to two-4 (DIT-FFT)

even sequence

odd sequence

10/15/2022 complexity: 𝑵 + 𝑵𝟐 Τ𝟐 < 𝑵𝟐


8-Point radix-2 Decimation-in-Time FFT

Ordered Output
Shuffled input

10/15/2022
Shuffled input 8-Point radix-2 Decimation-in-Time FFT

Ordered Output
10/15/2022
The basic butterfly for DIT-FFT

• We have a butterfly with one complex multiplication

10/15/2022
Shuffled input 8-point radix-2 Decimation-in-Time FFT

Ordered Output
10/15/2022
Bit reversed ordering “shuffling”
Gray coding “reflected binary code”

Normal Binary representation Reversed binary Shuffled


ordering representation sequence
x[0] 000 000 x[0]
x[1] 001 100 x[4]
x[2] 010 010 x[2]
x[3] 011 110 x[6]
x[4] 100 001 x[1]
x[5] 101 101 x[5]
x[6] 110 011 x[3]
x[7] 111 111 x[7]

10/15/2022
Complexity of radix-2 FFT

• The Fast Fourier Transform (FFT) reduces the complexity of computing the
DFT from 𝓞(𝑵𝟐 ) to 𝓞(𝑵𝒍𝒐𝒈𝟐 𝑵).

• Length 𝑵 = 𝟐𝑴 sequence leads to 𝑴 = 𝒍𝒐𝒈𝟐 𝑵-stages FFT.


• Each stage has 𝑁 complex multiplications and 𝑁-additions
• Complexity
≈ 𝓞 𝑵. 𝑴 = 𝓞(𝑵𝒍𝒐𝒈𝟐 𝑵).

• 𝑵𝒍𝒐𝒈𝟐 𝑵 ≪ 𝑵𝟐 for large 𝑁.

• FFT is in-place algorithm


→ no storage required

10/15/2022
High-speed convolution

• The length of 𝑥1 [𝑛] is 𝑁1 and the length of 𝑥2 [𝑛] is 𝑁2 and we would like
to compute 𝑥1 𝑛 ∗ 𝑥2 [𝑛]

𝑥1 𝑛 ∗ 𝑥2 𝑛 = 𝐼𝐹𝐹𝑇 𝐹𝐹𝑇(𝑥1 𝑛 ). 𝐹𝐹𝑇(𝑥2 [𝑛])

• Choose FFT size as:


𝑁 = 2𝑙𝑜𝑔2 𝑁1+𝑁2−1

where . is the ceiling operator

10/15/2022 19
Radix-2 Decimation in Frequency FFT (DIF-FFT)

𝐲 = 𝐅𝑁 𝐱
Multiply both sides from the left by the permutation matrix P
𝐏𝐲 = 𝐏𝐅𝑁 𝐱
The row-permuted DFT matrix becomes

𝐅𝑁/2 𝐅𝑁/2
𝐅෠𝑁 = 𝐏𝐅𝑁 =
𝐅𝑁/2 𝐃𝑁/2 −𝐅𝑁/2 𝐃𝑁/2
Radix-2 DIF FFT becomes
𝐲𝑒𝑣𝑒𝑛 𝐅𝑁/2 𝐅𝑁/2 𝐱𝐿
𝐲𝑜𝑑𝑑 = 𝐅𝑁/2 𝐃𝑁/2 −𝐅𝑁/2 𝐃𝑁/2 𝐱 𝑈

𝐲𝑒𝑣𝑒𝑛 𝐅𝑁/2 𝐱𝐿 + 𝐅𝑁/2 𝐱 𝑈


length-N DFT can be 𝐲𝑜𝑑𝑑 = 𝐅𝑁/2 𝐃𝑁/2 𝐱𝐿 − 𝐅𝑁/2 𝐃𝑁/2 𝐱 𝑈
computed using
TWO length-N/2 DFTs 𝐅𝑁/2 (𝐱 𝐿 +𝐱 𝑈 )
𝐲𝑒𝑣𝑒𝑛
𝐲𝑜𝑑𝑑 = 𝐅𝑁/2 𝐃𝑁/2 (𝐱𝐿 − 𝐱 𝑈 )
10/15/2022 -20
8-point Radix-2 Decimation-in-Frequency FFT

10/15/2022 21
8-point Radix-2 Decimation-in-Frequency FFT

10/15/2022
8-point Radix-2 Decimation-in-Frequency FFT
Ordered Input

Shuffled Output
10/15/2022
Basic butterfly for DIF-FFT

• Butterfly with one complex multiplication

10/15/2022
radix-𝐫 FFT
• 𝑥[𝑛] has length 𝑵 = 𝒓𝑴 .

• Number of stages is 𝑴 = 𝒍𝒐𝒈𝒓 𝑵

• Decimation-in-time and decimation-in-frequency


– In decimation-in-time structure, the sequence 𝑥[𝑛] is decomposed
into its 𝒓 −phases subsequences.
– In decimation-in-frequency structure, the sequence 𝑋[𝑘] is
decomposed into its 𝒓 −phases subsequences

• The basic butterfly has (𝑟 −inputs/ 𝑟 −outputs)

• Bit-reversed-order is in 𝒓-numbering system


– radix-2: use the binary number system {0, 1}
– radix-4: use the quaternary number system {0, 1, 2, 3}

• Most famous is radix-4 FFT

10/15/2022
Radix-4 Decimation in Time FFT (DIT-FFT)
𝐲 = 𝐅𝑁 𝐱
Permute the columns of the DFT matrix and the input vector
𝑁/4−1
𝐲 = 𝐅𝑁 𝐏 𝑇 𝐏𝐱 𝐃𝑁/4 = 𝑑𝑖𝑎𝑔(𝑊𝑁0 , 𝑊𝑁1 , ⋯ , 𝑊𝑁 )

The column-permuted DFT matrix becomes


𝐅𝑁/4 𝐃𝑁/4 𝐅𝑁/4 𝐃2𝑁/4 𝐅𝑁/4 𝐃3𝑁/4 𝐅𝑁/4
𝐅𝑁/4 −𝑗𝐃𝑁/4 𝐅𝑁/4 −𝐃2𝑁/4 𝐅𝑁/4 𝑗𝐃3𝑁/4 𝐅𝑁/4
𝐅෠𝑁 = 𝐅𝑁 𝐏 𝑇 =
𝐅𝑁/4 −𝐃𝑁/4 𝐅𝑁/4 𝐃2𝑁/4 𝐅𝑁/4 −𝐃3𝑁/4 𝐅𝑁/4
Radix-4 DIT-FFT 𝐅𝑁/4 𝑗𝐃𝑁/4 𝐅𝑁/4 −𝐃2𝑁/4 𝐅𝑁/4 −𝑗𝐃3𝑁/4 𝐅𝑁/4

𝐅𝑁/4 𝐃𝑁/4 𝐅𝑁/4 𝐃2𝑁/4 𝐅𝑁/4 𝐃3𝑁/4 𝐅𝑁/4


𝐲𝐿𝐿 𝐱0
𝐲𝐿𝑈 𝐅𝑁/4 −𝑗𝐃𝑁/4 𝐅𝑁/4 −𝐃2𝑁/4 𝐅𝑁/4 𝑗𝐃3𝑁/4 𝐅𝑁/4 𝐱1
𝐲𝑈𝐿 = 𝐅 −𝐃𝑁/4 𝐅𝑁/4 𝐃2𝑁/4 𝐅𝑁/4 −𝐃3𝑁/4 𝐅𝑁/4 𝐱2
𝑁/4
𝐲𝑈𝑈 𝐱3
𝐅𝑁/4 𝑗𝐃𝑁/4 𝐅𝑁/4 −𝐃2𝑁/4 𝐅𝑁/4 −𝑗𝐃3𝑁/4 𝐅𝑁/4
10/15/2022 26
• Example:

𝑇
• 𝐱 = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16

• The four phases of the vector 𝐱 are

1 2 3 4
• 𝐱 0 = 5 , 𝐱1 = 6 , 𝐱 = 7 , 𝐱 = 8
2 3
9 10 11 12
13 14 15 16

𝐱0
𝐱
𝐏𝐱 = 𝐱1
2
𝐱3

10/15/2022 27
Radix-4 Decimation in Time FFT (DIT-FFT)

The output y and The 4-phases of the input sequence x are

𝐲𝐿𝐿 𝐱0
𝐲𝐿𝑈 𝐱1
𝐲= 𝐲 , 𝐏𝐱 = 𝐱
𝑈𝐿 2
𝐲𝑈𝑈 𝐱3

Radix-4 DIT-FFT becomes


length-N DFT can be computed using FOUR length-N/4 DFTs
𝐅𝑁/4 𝐱 0 + 𝐃𝑁/4 𝐅𝑁/4 𝐱1 + 𝐃2𝑁/4 𝐅𝑁/4 𝐱 2 + 𝐃3𝑁/4 𝐅𝑁/4 𝐱3
𝐲𝐿𝐿
𝐲𝐿𝑈 𝐅𝑁/4 𝐱0 − 𝑗𝐃𝑁/4 𝐅𝑁/4 𝐱1 − 𝐃2𝑁/4 𝐅𝑁/4 𝐱 2 + 𝑗𝐃3𝑁/4 𝐅𝑁/4 𝐱3
𝐲𝑈𝐿 = 𝐅 𝐱 − 𝐃 𝐅 𝐱 + 𝐃2 𝐅 𝐱 − 𝐃3 𝐅 𝐱
𝑁/4 0 𝑁/4 𝑁/4 1 𝑁/4 𝑁/4 2 𝑁/4 𝑁/4 3
𝐲𝑈𝑈
𝐅𝑁/4 𝐱0 + 𝑗𝐃𝑁/4 𝐅𝑁/4 𝐱1 − 𝐃2𝑁/4 𝐅𝑁/4 𝐱 2 − 𝑗𝐃3𝑁/4 𝐅𝑁/4 𝐱3

10/15/2022 28
Radix-4 Decimation in time FFT (DIT-FFT)

The basic butterfly for Radix-4 DIT-FFT becomes

𝐲𝐿𝐿 𝐈𝑁/4 𝐈𝑁/4 𝐈𝑁/4 𝐈𝑁/4 𝐅𝑁/4 𝐱 0


𝐲𝐿𝑈 𝐈𝑁/4 −𝑗𝐈𝑁/4 −𝐈𝑁/4 𝑗𝐈𝑁/4 𝐃𝑁/4 𝐅𝑁/4 𝐱1
𝐲𝑈𝐿 = 𝐈𝑁/4 −𝐈𝑁/4 𝐈𝑁/4 −𝐈𝑁/4 𝐃2𝑁/4 𝐅𝑁/4 𝐱 2
𝐲𝑈𝑈 𝐈𝑁/4 𝑗𝐈𝑁/4 −𝐈𝑁/4 −𝑗𝐈𝑁/4 𝐃3𝑁/4 𝐅𝑁/4 𝐱 3

10/15/2022 29
Radix-4 Decimation-in-Frequency FFT (DIF-FFT)

𝐲 = 𝐅𝑁 𝐱
• Multiply from the left by the permutation matrix 𝑷
𝑁/4−1
𝐏𝐲 = 𝐏𝐅𝐍 𝐱 𝐃𝑁/4 = 𝑑𝑖𝑎𝑔(𝑊𝑁0 , 𝑊𝑁1 , ⋯ , 𝑊𝑁 )

• The row-permuted DFT matrix

𝐅𝑁/4 𝐅𝑁/4 𝐅𝑁/4 𝐅𝑁/4


𝐅𝑁/4 𝐃𝑁/4 −𝑗𝐅𝑁/4 𝐃𝑁/4 −𝐅𝑁/4 𝐃𝑁/4 𝑗𝐅𝑁/4 𝐃𝑁/4
𝐅෠𝑁 = 𝐏𝐅𝑁 = 𝐅 𝐃2 −𝐅𝑁/4 𝐃2𝑁/4 𝐅𝑁/4 𝐃2𝑁/4 −𝐅𝑁/4 𝐃2𝑁/4
𝑁/4 𝑁/4
𝐅𝑁/4 𝐃3𝑁/4 𝑗𝐅𝑁/4 𝐃3𝑁/4 −𝐅𝑁/4 𝐃3𝑁/4 −𝑗𝐅𝑁/4 𝐃3𝑁/4
• Radix-4 DIF DFT

𝐲0 𝐅𝑁/4 𝐅𝑁/4 𝐅𝑁/4 𝐅𝑁/4 𝐱 𝐿𝐿


𝐲1 𝐅𝑁/4 𝐃𝑁/4 −𝑗𝐅𝑁/4 𝐃𝑁/4 −𝐅𝑁/4 𝐃𝑁/4 𝑗𝐅𝑁/4 𝐃𝑁/4 𝐱 𝐿𝑈
𝐲2 = 𝐅𝑁/4 𝐃2𝑁/4 −𝐅𝑁/4 𝐃2𝑁/4 𝐅𝑁/4 𝐃2𝑁/4 −𝐅𝑁/4 𝐃2𝑁/4 𝐱 𝑈𝐿
𝐲3 𝐅𝑁/4 𝐃3𝑁/4 𝑗𝐅𝑁/4 𝐃3𝑁/4 −𝐅𝑁/4 𝐃3𝑁/4 −𝑗𝐅𝑁/4 𝐃3𝑁/4 𝐱 𝑈𝑈
10/15/2022 30
Radix-4 Decimation in Frequency FFT (DIF-FFT)
The 4-phases of the output y and the the input sequence x are
𝐲0 𝐱 𝐿𝐿
𝐲1 𝐱 𝐿𝑈
𝐏𝐲 = 𝐲 , 𝐱= 𝐱
2 𝑈𝐿
𝐲3 𝐱 𝑈𝑈

length-N DFT can be computed using FOUR length-N/4 DFTs

𝐲0 𝐅𝑁/4 𝐱𝐿𝐿 + 𝐅𝑁/4 𝐱 𝐿𝑈 + 𝐅𝑁/4 𝐱 𝑈𝐿 + 𝐅𝑁/4 𝐱𝑈𝑈


𝐲1 𝐅𝑁/4 𝐃𝑁/4 𝐱 𝐿𝐿 − 𝑗𝐅𝑁/4 𝐃𝑁/4 𝐱 𝐿𝑈 − 𝐅𝑁/4 𝐃𝑁/4 𝐱𝑈𝐿 + 𝑗𝐅𝑁/4 𝐃𝑁/4 𝐱𝑈𝑈
𝐲2 = 𝐅𝑁/4 𝐃2𝑁/4 𝐱 𝐿𝐿 − 𝐅𝑁/4 𝐃2𝑁/4 𝐱 𝐿𝑈 + 𝐅𝑁/4 𝐃2𝑁/4 𝐱𝑈𝐿 − 𝐅𝑁/4 𝐃2𝑁/4 𝐱 𝑈𝑈
𝐲3 𝐅𝑁/4 𝐃3𝑁/4 𝐱 𝐿𝐿 + 𝑗𝐅𝑁/4 𝐃3𝑁/4 𝐱 𝐿𝑈 − 𝐅𝑁/4 𝐃3𝑁/4 𝐱𝑈𝐿 − 𝑗𝐅𝑁/4 𝐃3𝑁/4 𝐱𝑈𝑈
Radix-4 DIF-FFT becomes

𝐲0 𝐅𝑁/4 (𝐱𝐿𝐿 + 𝐱 𝐿𝑈 + 𝐱 𝑈𝐿 + 𝐱 𝑈𝑈 )
𝐲1 𝐅𝑁/4 𝐃𝑁/4 (𝐱 𝐿𝐿 − 𝑗𝐱 𝐿𝑈 − 𝐱 𝑈𝐿 + 𝑗𝐱 𝑈𝑈 )
𝐲2 = 𝐅𝑁/4 𝐃2𝑁/4 (𝐱 𝐿𝐿 − 𝐱 𝐿𝑈 + 𝐱 𝑈𝐿 − 𝐱 𝑈𝑈 )
𝐲3
𝐅𝑁/4 𝐃3𝑁/4 (𝐱 𝐿𝐿 + 𝑗𝐱 𝐿𝑈 − 𝐱 𝑈𝐿 − 𝑗𝐱 𝑈𝑈 )
10/15/2022 31
• Computation of radix-4 output ordering

• Representation is performed in Input Quaternary Reversed Output


index representation order index
the quaternary number system
{0,1,2,3} 0 00 00 0
1 01 10 4
2 02 20 8
3 03 30 12
4 10 01 1
5 11 11 5
6 12 21 9
7 13 31 13
8 20 02 2
9 21 12 6
10 22 22 10
11 23 32 14
12 30 03 3
13 31 13 7
14 32 23 11
15 33 33 15
10/15/2022

You might also like