發表文章

目前顯示的是有「python」標籤的文章

DSP筆記2_傅立葉轉換於頻譜分析的應用筆記

圖片
  關於「譜」 https://www.youtube.com/watch?v=F2Yl7N2uQWs 關於譜的觀念可以從光學領域追朔,以前學過當一束光經過三稜鏡,會根據光的波長(週期)被分解為紅橙黃綠藍....等色彩,也稱作(可見光)光譜。 對於訊號而言,頻譜分析也就是所謂借助傅立葉變化,類似三稜鏡一般將訊號轉換到頻率域,藉此去解析出構成原始訊號不同頻率成分。而描述頻率分量的曲線就稱作訊號的頻譜。 如圖中所示,原始波形訊號經由傅立葉分解出三條不同訊號波長的偕波集合。而此時若我們從這張圖的時間軸的朝向去看,波長的倒數也就是頻率,可去看不同頻率上的幅值。 傅立葉這位法國數學家,當時提出「任何時間函數都可分解為若干正弦訊號的總和」。 正弦函數是構成訊號的描述基本單元 以下這三個參數通常就能用於區分不同正弦訊號的Identifier,更可以理解為訊號的資訊載體。 A 振幅,反映訊號的強度(顯著程度) ω 頻率,衡量單位時間內訊號均勻重複的次數 Φ 相位,衡量時間延遲或時間偏移,可提供我們訊號於全局時間軸上出現時刻。 每個參數皆能乘載反映訊號產生原本質特徵的識別資訊 像是以下這個週期性波形,僅依靠肉眼觀察。我們無法很明確得知其數學模型。 無法得知該波形的準確頻率。若只依靠時域資訊,我們對複雜模式分析能力有限。 這也是為何需要將其分解為正弦訊號的原因。 因為我們人類對正弦訊號的特性比較熟悉。 傅立葉變換的核心是根據頻率,將原始訊號分解為若干正弦訊號的總和。 比方下面左側原始波形,經過傅立葉轉換分解後,得知可以用4個正弦訊號合成這個波形。 所以可以檢測到四個頻率成分 若要把這塊訊息用更簡潔呈現方式,可以透過繪製一個新的圖表。 橫軸以頻率而非時間作為自變數,縱軸以振幅來表示。 第一個正弦訊號在頻率對應位置是1,振幅為3。 第二個正弦訊號在頻率對應位置是7,振幅為1.5。 其他依此類推。 而相位參數則可以獨立呈現在另一張圖中 傅立葉函數以時域訊號作為輸入,輸出包含幅度和相位資訊的頻率函數。 當我們有能力拆解出頻譜資訊後可以做捨麼用途? 在工業領域中,可以想像遇到類似區分齒輪箱振動訊號原始波形,若從原始時域訊號難以發現問題,但從頻譜則可以清楚看到主要振動頻率,從而延伸做像是按傳動關係進一步推定振動源或故障異常分析等應用。 要從給定時域訊號中提取傅立葉變化就兩步驟 Step1....

Python物件導向語法筆記2_方法覆寫Override、方法多載Overloading、私有成員會前面多兩個底線

圖片
方法覆寫Override 程式1-原本子類別方法呼叫 class Parent : def myMethod ( self ): print ( "父類別方法" ) class Child (Parent): def myMethod ( self ): print ( "子類別方法" ) c = Child() c.myMethod() 程式2-方法覆寫Override super(子類別,self).同名方法 class Parent : def myMethod ( self ): print ( "父類別方法" ) class Child (Parent): def myMethod ( self ): print ( "子類別方法" ) super (Child, self ).myMethod() c = Child() c.myMethod() 方法多載Overloading 在python程式語言中,加減乘除四則運算子皆可用於預設變數、list的資料型別,但是如果是兩個自訂物件要進行運算,就勢必要重新定義這些運算子,不然就會發生不如預期的錯誤。 除了算術運算以外,比如要針對物件之間的比較運算、邏輯運算也都需要進行overloading。 固定覆寫寫法要留意,是以下這些制式化方法名稱 以下是一個簡單的二維點座標案例 TypeError: unsupported operand type(s) for +: 'Point' and 'Point' 另外像是要打印點座標直接print也會直接印出記憶體位置 程式1-As If class Point : def __init__ ( self ,x= 0 ,y= 0 ): self .x = x self .y = y p1 = Point( 4 , 3 ) p2 = Point( 2 , 1 ) #錯誤示範 #print(p2) #print(p1+p2) 程式2-To Be class Point : ...

Python物件導向語法筆記1_類別物件的初始化與共用成員、模組化、繼承

圖片
  一個簡單的Employee物件示範 __init__用途是定義物件剛建立後,預計初始化的流程 類別內的method和一般python函數定義不同,必須包含參數self,並且務必放在第一個參數位置 在單一個main.py程式定義物件並使用物件 class Employee : empCount = 0 #定義物件剛建立後,預計初始化的流程。 #self就是物件自己本身 def __init__ ( self , name, salary): self .name = name self .yoursalary = salary Employee.empCount += 1 #和一般python函數定義不同,類別內的method必須包含參數self,並且務必放在第一個參數位置 def displayTotalEmpCount ( self ): print ( "Total Employee Count: %d" % self .empCount) def displayEmpInfo ( self ): print ( "Name:" , self .name, "Salary:" , self .yoursalary) emp1 = Employee( "Mike" , 42000 ) emp1.displayEmpInfo() emp1.displayTotalEmpCount() emp2 = Employee( "Michelle" , 50000 ) emp2.displayEmpInfo() emp1.displayTotalEmpCount() emp2.displayTotalEmpCount() 可看到empCount會是被各個獨立的物件實體,所共用的屬性,類似以前C#、Java的static修飾。 練習程式2-獨立物件實體成員屬性額外定義與刪除 class Employee : empCount = 0 #定義物件剛建立後,預計初始化的流程。 #self就是物...

DSP筆記3_使用matplotlib練習繪製連續時間訊號子圖做訊號不同頻率比較

圖片
  測試程式 import numpy as np import matplotlib.pyplot as plt t = np.arange( 0 , 1 , 0.01 ) xt1 = np.cos( 2 *np.pi* 3 *t) xt2 = np.cos( 2 *np.pi* 5 *t) xt3 = np.cos( 2 *np.pi* 7 *t) xt4 = np.cos( 2 *np.pi* 9 *t) #subplot(row,column,繪製圖表個數) plt.subplot( 4 , 1 , 1 ) plt.plot(t,xt1) plt.subplot( 4 , 1 , 2 ) plt.plot(t,xt2) plt.subplot( 4 , 1 , 3 ) plt.plot(t,xt3) plt.subplot( 4 , 1 , 4 ) plt.plot(t,xt4) plt.show()

DSP筆記2_使用 NumPy練習繪製連續時間訊號正弦波(Sine)_餘弦波(Cosine)_跟離散時間訊號繪製_stem用法

圖片
  連續時間正弦波-數位取樣訊號 從 0 秒取樣到 0.999 秒,每隔:0.001秒取一個樣本。 plt.plot(t, xt)會把點連起來,像連續波形。 程式碼 import numpy as np import matplotlib.pyplot as plt t = np.arange( 0 , 1 , 0.001 ) #print(t) xt = np.sin( 2 *np.pi* 3 *t) plt.plot(t, xt) plt.title( "Sine Wave" ) plt.xlabel( "Time" ) plt.ylabel( "Amplitude" ) plt.show() xt = np.cos( 2 *np.pi* 3 *t) plt.plot(t, xt) plt.title( "Cosine Wave" ) plt.xlabel( "Time" ) plt.ylabel( "Amplitude" ) plt.show() 正弦波最標準的數學式通常寫成: 符號 A : 振幅 Amplitude f : 頻率 Frequency ,每秒完成幾個週期。 t : 時間 Time  ϕ : 初始相位 Phase 2πf : 角頻率,圓的一整圈是:360度,而在數學上通常不用度數,而使用「弧度 radian」。 36 0 ∘= 2π radians 對照式子可推得各參數分別如下 振幅=1 訊號頻率=3 Hz ,代表一秒鐘有 3 個週期。由於時間剛好介於一秒,因此會看到三個完整的正弦波 初始相位=0 角頻率=6π rad/s t = 0~0.999 秒 而餘弦波也依樣畫葫蘆。 若固定在一個 3 Hz 正弦波,於不同取樣間隔下,離散取樣點會有什麼差異。 左側是用0.001間隔密度採樣。也就是在一秒鐘內對 3 Hz 正弦波取 1000 點。 右側則用0.01間隔密度採樣,取樣間隔變大了 10 倍。每秒只取 100 個樣本。 stem() 很常用來表示離散時間訊號,每一根垂直線代表「一個取樣值」。 程式碼 import numpy as np import matplotlib.pyplot as p...

Python透過Scipy的convolve實踐Sliding Window Detrend

圖片
  一般數位訊號如果出現某種逐漸遞增、遞減的趨勢 通常都需要做一個所謂去趨勢化(detrend)的前置處理。 scipy內建的detrend函數(scipy.signal.detrend) https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.detrend.html 是採用「簡單迴歸法」(最小平方法的線性迴歸)的移除趨勢方法 從時間序列資料中移除趨勢成分的函數,透過執行線性迴歸(嚴格來說是簡單迴歸)來移除趨勢。 演算法步驟 步驟 1:計算線性趨勢 針對資料使用最小平方法執行線性迴歸,也就是以直線近似資料的趨勢。 透過線性迴歸,可取得表示資料趨勢之直線的斜率與截距。 步驟 2:移除趨勢 將計算出的線性趨勢(直線)從原始資料中扣除。 如此一來,便可從資料中移除長期變動成分,僅保留雜訊成分。 和這次要實作的sliding window 方法不同 以下是藉由scipy.signal內建的convolve函數實作的滑動視窗去趨勢法 https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve.html#scipy.signal.convolve import numpy as np import matplotlib.pyplot as plt from scipy.signal import convolve # ========================================== # 1. 產生模擬訊號 (弦波 + 向上飄移的趨勢 + 雜訊) # ========================================== t = np.linspace( 0 , 10 , 150 ) original_trend = 0.5 * t # 緩慢向上的線性趨勢 signal_data = np.sin( 2 * np.pi * 1.0 * t) + original_trend + np.random.normal( 0 , 0.2 , 150 ) # 2. 執行滑動視窗去趨勢 (使用卷積法) # ==================...

人工智慧金融投資決策_ Binomial Tree Pricing

圖片
One-Period Binomial Model 二項樹(Binomial Tree)二項式定價模型 期權的二項式定價模型是由Cox, Ross and Rubinstein在 1979 年首次提出的。 是一種常用的方法,用來近似股票、選擇權或其他資產價格的變動。 二項樹是一種圖形表示方式,用來呈現資產在存續期間內,股票價格可能遵循的各種不同路徑。 在進行選擇權定價時,其基本假設是股票價格遵循隨機漫步(Random Walk)。 使用二項式樹時的主要假設包括利率保持不變、沒有股息發放,以及不存在交易成本或稅金。此模型最適用於期限較長或涉及有股息支付的證券的期權定價。 使用二項式樹來計算價格的過程會比Black Scholes還來的慢。 假設一個經濟體情境 屬於一個無風險債券(risk-free bond),其無風險利率為 12%。 一檔股票,目前價格為 20 美元。 三個月後,股票價格將會是 22 美元或 18 美元。 將股票價格簡化為要馬上漲、要馬下跌 我們要將三個月到期的call option price去定價,履約價為21 當三個月到期時股票價格漲到22元,這時候call price價值就是1元,此時就會履約。 若未來股票下跌到18元,此時call price價值就是0元,則不履約。 在每一個時間步驟中,股票價格都有某個特定機率上漲某個百分比幅度,也有某個特定機率下跌某個百分比幅度。 如果我們能建立一個投資組合(Portfolio),使其報酬能夠複製選擇權的到期損益(Replicate the Payoff of an Option),那麼在市場不存在套利機會的情況下 選擇權價格=複製投資組合的價格 也就是說,如果「股票+無風險債券」組成的投資組合,未來不論股價上漲或下跌,都能產生 和某個選擇權完全相同的損益,那麼今天這兩者的價格就必須相同;否則市場上就會出現無風險套利機會。 Binomial Tree Option Pricing Formula 假設要讓投資組合變成無風險投資組合 也就表示在「上漲」與「下跌」兩種情況下,投資組合的最終價值完全一樣 這個 Δ 就是所謂的 Delta 避險比率(hedge ratio)。 假設無風險利率為 r ,由於這個投資組合已經沒有風險,因此它應該只能賺取 無風險利率 。 到期時投資組合價值折現回今天為: 因此目前投資...