發表文章

DSP筆記3_Power Spectrum Estimation_功率譜及功率譜密度(Periodogram 與 Welch’s Method)

圖片
  以前國高中物理學過 功率的定義:作功的效率,單位時間內所作的功。 電功率 : 電源每秒提供的電能(或電器每秒消耗多少電能) https://www.youtube.com/watch?v=KOFEY4akR0c 在前面 DSP筆記2_傅立葉轉換於頻譜分析的應用筆記 筆記章節中,已經介紹過一些傅立葉轉換與頻譜分析的基本概念,。 當我們對時域訊號執行 FFT(Fast Fourier Transform)時,會得到一組複數形式的頻域資料,每一個頻率點都包含實部(Real Part)與虛部(Imaginary Part)向量。 實部與虛部本身都可能具有正值或負值,但它們並不直接代表相位。若要取得某個頻率成分的相位資訊,可以利用實部與虛部計算 atan2會得到一個具有方向性(朝上為正、朝下為負)的相位資訊實部、虛部圖。 而在一般的頻譜分析中,我們通常比較關心各個頻率成分的大小,因此常會對 FFT 結果取絕對值(模長),類似之前第一篇筆記文章 DSP筆記1_使用 NumPy自帶的fft做_觀察fft結果、ifft後的訊號波形圖、頻率對應相位 的呈現結果。藉此得到幅度頻譜(Magnitude Spectrum)。對於實數時域訊號,由於 FFT 頻譜具有共軛對稱特性,因此實務上也常只觀察正頻率範圍,形成單邊頻譜(Single-Sided Spectrum)。 功率頻(Power Spectrum) 我們可以將週期性訊號視為由多個頻率所組成。例如,聲音是由多種音調組成的,而光則是由多種顏色組成的。頻率的範圍稱為頻譜(frequency spectrum)。 當我們分析訊號的頻譜時,通常起手式是要取得對該訊號做傅立葉轉換後的結果。 截自 Python Data Analysis Cookbook Published by Packt Publishing 而週期圖(periodogram)延伸了這一點,其數值等於傅立葉轉換幅度的平方 接下來可以從電路中的功率概念理解功率譜。對於純1Ω電阻負載,當我們假設R(電阻)固定為1Ω,則 P=V²=I² 。因此可以看到,功率與訊號振幅的平方有密切關係。。 因此當我們在訊號處理中,假設在估算一段訊號其功率譜,可以理解也是直接對頻譜圖結果取平方,更嚴謹的來說就是對 FFT 的複數結果取模長平方。 只不過縱軸部分會是以dB(分貝)去表示...

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

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

Tensorflow實作_阿拉伯手寫數字分類的實作_基本功常見操作

圖片
 本篇實作 使用python3.11 tensorflow2.20 ->這個裝好通常會自動把numpy2.4.6、tensorboard2.20、h5py 也裝好 matplotlib3.11.1 numpy2.4.6 tensorboard2.20 第一次於專案裝會要等大概10~15分鐘,會要等好一陣子。 Phase1程式碼-載入mnist資料集 嘗試透過將像素值內容非0的統一轉為1,觀察圖像張量資料。 import tensorflow as tf mnist = tf.keras.datasets.mnist # 匯入 MNIST 阿拉伯數字訓練資料 (x_train, y_train),(x_test, y_test) = mnist.load_data() # 訓練/測試資料的 X/y 維度 print ( "訓練資料X維度:{0}" .format(x_train.shape)) print ( "訓練資料Y維度:{0}" .format(y_train.shape)) print ( "測試資料X維度:{0}" .format(x_test.shape)) print ( "測試資料X維度:{0}" .format(y_test.shape)) # 訓練資料前10筆圖片的數字標準答案 print (y_train[: 10 ]) print (x_train[ 0 ]) #打印第一張訓練圖的像素值矩陣 data = x_train[ 0 ].copy() data[data> 0 ]= 1 #把非0的數字轉為1,顯示第1張圖片 print ( "==========================================" ) #把轉換後二維矩陣內容印出來,可以隱約看出數字為5 text_image=[] for i in range (data.shape[ 0 ]): text_image.append( '' .join( str (data[i]))) for i, row in enumerate (text_image): if i < len (...

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就是物...