DFT Matrix
2022/04/26
說明:
-----
https://pixabay.com/zh/photos/snake-python-serpent-scales-543243/
-----
◎ 問題:
-----
Q1:如何畫出離散傅立葉變換矩陣的圖形(時鐘圖)?
Fig. 1. Circle and DFT Matrix [1], [3].
A1:參考代碼一。
-----
代碼一:
import numpy as np import matplotlib.pyplot as plt # plot subplot def p1_sub_plot(N, i, j): plt.subplot(N, N, i*N+j+1) # 畫圓 theta = np.linspace(0, 2*np.pi, 100) # 100 radius = 1 # radius a = radius*np.cos(theta) b = radius*np.sin(theta) plt.plot(a, b) # 畫箭頭 omg = -2*np.pi/N # omega = -2 pi / N x1 = radius*np.cos(omg*i*j) y1 = radius*np.sin(omg*i*j) x_pos = 0 y_pos = 0 x_direct = x1 y_direct = y1 plt.quiver(x_pos, y_pos, x_direct, y_direct, scale = 2) # scale return N = 8 # 8 points Discrete Fourier Transform FSIZE = 16 # figure size plt.figure(figsize = (FSIZE, FSIZE)) for i in range(N): for j in range(N): p1_sub_plot(N, i, j) # plt.savefig('/content/drive/My Drive/dft_1.png') # plt.show()
-----
Q2:如何畫出離散傅立葉變換矩陣的圖形(弦波圖)?
Fig. 2. Wave and DFT Matrix [2].
A2:參考代碼二。
-----
代碼二:
# plot subplot def p2_sub_plot(N, i): plt.subplot(N, 1, i+1) plt.ylim(-1.2, 1.2) x = np.linspace(0, 2*np.pi, 100) if (i > N/2): freq = i - N else: freq = i y1 = np.cos(-freq*x) y2 = np.sin(-freq*x) plt.plot(x, y1, 'r') plt.plot(x, y2, 'b--') # 畫粗點 omg = 2*np.pi/N # omega = 2 * pi / N for j in range(N): p = omg*j # 8 points pc = np.cos(-freq*p) ps = np.sin(-freq*p) plt.plot(p, pc, 'bo') plt.plot(p, ps, 'bo') return plt.figure(figsize = (FSIZE, FSIZE)) for i in range(N): p2_sub_plot(N, i) # plt.savefig('/content/drive/My Drive/dft_2.png') # plt.show()
-----
Q3:如何畫出離散傅立葉變換矩陣的圖形(弦波圖)?
Fig. 3. Wave and DFT Matrix [2].
A3:參考代碼三。
-----
代碼三:
將代碼二中的
if (i > N/2): freq = i - N else: freq = i
改成
freq = i
即可。
-----
Q4:離散傅立葉變換矩陣是什麼?
Fig. 4. DFT Matrix [2].
A4:參考圖四。
-----
# 主值
# 慣例
「其中 ω 是 1 的 n 次方根的主值(primitive nth root of unity),大小為 e^(-2πi/N)。需要注意的是在總和前面的正規化因數,還有 ω 中指數的正負號是依據慣例,並且會因為處理的方法有所不同。」[2]。
-----
「The top row (or the left-hand column) changes not at all; therefore, F0 is the resultant when the amplitudes augment each other. The second row changes by 1/nth of a circle, going from left to right. The third row changes by 2/nths of a circle; the fourth row changes by 3/nths of a circle; the fifth row, here, changes by 4/nths = 4/8 = 1/2 a circle.」[3]。
翻譯:「第一列(或左側行)根本沒有變化;因此,F0 是振幅相互增加時的結果。第二列從左到右變化 1 / nth 個圓。第列行變化 2 / nths of a circle; 第四列變化 3 / nths of a circle; 第五列在這裡變化 4 / nths = 4/8 = 1/2 一圈。」
「Therefore, F4 is the resultant when the even terms are set at odds with the odd terms.」[3]。
翻譯:
「可以說這個矩陣的上面列是信號的正頻率部份的強度而下面列是信號負頻率部份的強度。」[2]。
-----
備註一:
# Word 公式中,如何輸入大型矩陣。
「全選當前的矩陣元素,點選滑鼠右鍵,選擇【插入】,然後通過插入行或列的方法將 3×3 的矩陣變成 5×5。」[9]。
-----
References
# DFT Matrix
[1] Wave - 演算法筆記
https://web.ntnu.edu.tw/~algo/Wave.html
# DFT Matrix
[2] 離散傅里葉變換矩陣 - 維基百科,自由的百科全書
# DFT Matrix
[3] Digital Signal Processing/Discrete Fourier Transform - Wikibooks, open books for an open world
https://en.wikibooks.org/wiki/Digital_Signal_Processing/Discrete_Fourier_Transform
# 四張圖(或 64 張圖)
[4] Man and History: The Basics of Waves
https://mandhistory.blogspot.com/2022/03/the-basics-of-waves.html
# DFT Matrix 中的一個元素
[5] Man and History: Roots of Unity
http://mandhistory.blogspot.com/2022/04/roots-of-unity.html
# 巢狀迴圈:for and range()
[6] 菜鳥工程師 肉豬: Python 九九乘法表 使用for迴圈
https://matthung0807.blogspot.com/2019/11/python-for.html
# 函式:def
[7] Defining Your Own Python Function – Real Python
https://realpython.com/defining-your-own-python-function/
# if else
[8] Python 多行 if 條件 | D棧 - Delft Stack
https://www.delftstack.com/zh-tw/howto/python/python-multiline-if-condition/
# 大型矩陣
[9] Word中的公式:如何插入任意行列的矩陣? - IT145.com
https://www.it145.com/9/44616.html
# DFT 原理說明
[10] Man and History: Discrete Fourier Transform
https://mandhistory.blogspot.com/2022/03/discrete-fourier-transform.html
-----
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。