發表文章

DSP筆記1_使用 NumPy自帶的fft做_觀察fft結果、ifft後的訊號波形圖、頻率對應相位

圖片
在Python當中我們可使用 FFT 函式,將時域訊號轉換成頻域訊號。 例如使用 NumPy自帶的: import numpy.fft as fft 而另一套scipy引入方式則是用 import scipy.fftpack as scifft fft功能:主要就是把時間序列訊號做FFT,獲得其幾個頻率、振福和初始相位。 ifft功能:也就是把複數值序列做傅立葉逆變化,獲得複數值的訊號,取其實部,是時頻訊號。可以寫出訊號的余弦函數的結構式。 以下就DSP幾個術語做個介紹 訊號頻率: 指訊號本身週期性變化的速度,通常使用 f 表示,單位為赫茲(Hz)。 例如,一秒鐘重複 10 次的訊號,其頻率為 10 Hz。 取樣頻率: 指每秒鐘對連續訊號取樣的次數,通常使用 Fs 表示,單位也是 Hz。 表示每秒取得 100 個取樣點。 奈奎斯(Nyquist-Shannon sampling theorem)取樣定理: 為了正確還原訊號,取樣頻率至少必須大於訊號最高頻率的兩倍。 舉例:像是人類聽力範圍坐落於20赫茲-20000赫茲(20kHz) 根據奈奎斯取樣定理,fs > 2 fH 也就是 fs > 2 * 20kHz 目前網際網路流傳的音樂檔mp3,其取樣頻率也通常是設在44kHz、48kHz。 實際應用通常會選擇比兩倍更高的取樣頻率,以降低混疊現象。 FFT 頻譜幅值: fft_magnitude = np.abs(np.fft.fft(signal, n=NFFT)) np.abs() 用來計算 FFT 複數結果的絕對值,也就是頻譜的幅值。 振幅(頻)譜(amplitude spectrum): 透過傅立葉變換(Fourier Transform)將時域訊號轉成頻域後,取其絕對值或強度大小而得到的結果。 能量訊號: 若訊號振幅的絕對值平方,在整個時間範圍 (−∞,+∞) 內的積分為有限值,則稱為能量訊號。 常見例子包括有限時間的方波訊號、三角形訊號、脈衝訊號、暫態訊號、非週期性的確定訊號,以及非隨機訊號。 能量頻譜: 又稱為「能量頻譜密度」。圖形的橫軸表示頻率,縱軸表示訊號在各頻率上的能量。 訊號總能量可由各頻率成分的幅值平方加總或積分得到。 實際分析時,可以利用快速傅立葉轉換 FFT 計算訊號的頻率成分,再將頻譜幅值取絕對值平方,得到能量頻譜。 能量頻譜的實...

透過Dlib的臉部81個關鍵點去抓取額頭、臉頰、人中ROI區塊各自劃分22個區域

圖片
採用程式語言: python3.11 套件: dlib-bin 20.0.1 opencv-python4.11.0.86 numpy2.2.6 81個關鍵點下載網址 https://github.com/codeniko/shape_predictor_81_face_landmarks/blob/master/shape_predictor_81_face_landmarks.dat 除了原來的 68 個臉部標誌外,作者還額外添加了 13 個標誌來覆蓋前額區域。 第一階段測試程式 from pathlib import Path import cv2 import dlib import numpy as np VIDEO_PATH = R"F:\DeepfakeTIMIT.tar\DeepfakeTIMIT\higher_quality\fjem0\sa1-video-fkms0.avi" MODEL_PATH = R"C:\img\shape_predictor_81_face_landmarks.dat" #將一個大矩形切成多個小矩形 def split_rectangle (box, rows, cols, region_name): """ box: (x1, y1, x2, y2) rows: 垂直方向切幾列 cols: 水平方向切幾欄 """ x1, y1, x2, y2 = box # 防止座標順序顛倒 x1, x2 = sorted (( int (x1), int (x2))) y1, y2 = sorted (( int (y1), int (y2))) # 無效矩形不處理 if x2 <= x1 or y2 <= y1: return [] xs = np.linspace(x1, x2, cols + 1 , dtype= int ) ys = np.linspace(y1, y2, rows + 1 , dtype= int ) small...

rPPG訊號(脈搏波)獲取測試程式_透過臉部影片額頭部位亮度變化_來擷取生理訊號以測量心率

圖片
  脈搏波是隨心臟跳動而變化的血流量。回憶過去若曾去過醫院做健檢,你應該有看過類似感測器夾在手指上,測量出像山峰一般的波形,那就是脈搏波。脈搏波是利用血液中的血紅素會大量吸收綠光的特性。 市面上很多運動手錶,如今也已涵蓋心律、血氧測量等諸多身體指數量測,多半採用到所謂脈搏感測技術,常見的rPPG藉由反射行脈波測量手段。 用綠光的原因在於能被淺層靜脈中的血紅素部分吸收,剩餘沒被吸收的綠光則會反射回來,有利於被手錶感測器量測。 至於紅光部分則穿透能力較強,能反射回來被感測器分析的比例較少,而不利於運動時全程心率量測。 運動手錶主要就是利用血紅素密度變化,去間接推斷人體心率變化。每當人體心臟收縮跟舒張,血管中的血紅素密度就會有密度起伏。若經過手錶等感測裝置的血紅素密度高,被偵測到的綠光就少。反之,若經過的血紅素密度低,則被偵測到的綠光就多。 而從視訊或是影片中測量脈搏波的原理也是一樣的。一般電腦中視訊、影片有分為RGB三種顏色通道不同的光線強度,以 0 到 255 個階度的亮度值進行記錄。 我們可以拍攝或擷取皮膚表面ROI所得視訊影像中的綠色成分光線強度,根據心臟跳動引起的血紅素變化量而產生變化。 同理可得知,拍攝皮膚表面的視訊影像中,綠色成分的變動即為脈搏波。 為了讓血紅素增加時訊號隨之變大,脈搏波訊號會使用從最大亮度值(255)來減去綠色亮度值後所得的數值。透過計算一分鐘內出現多少次脈搏波,也就是測量一分鐘內心臟跳動的次數,就能從視訊影像中測量出心率。 拿一個10秒的公開測試影片作測試 Stage1.先定位額頭部位ROI import cv2 import numpy as np from scipy import signal import matplotlib.pyplot as plt movie = "face.mp4" video_path = ( "C:/img/{}" .format(movie)) cap = cv2.VideoCapture(video_path) cap.set(cv2.CAP_PROP_POS_FRAMES, 0 ) roi = ( 147 , 69 , 340 , 178 ) ret, frame_bgr = cap.read() #先只讀取第一frame i...

MediaPipe Face Mesh_標記左右臉頰、人中ROI

圖片
  參考paper https://www.techscience.com/cmc/v79n3/57116/html 採用Python版本3.11.9 搭配 opencv-python 4.11.0.86 mediapipe 0.10.21 使用舊版Face Mesh 468個特徵點 測試資料集韓國的KoDF 測試程式 import cv2 import mediapipe as mp import numpy as np #初始化MediaPipe Face Mesh mp_face_mesh = mp.solutions.face_mesh mp_drawing = mp.solutions.drawing_utils # 開啟視訊鏡頭 # cap = cv2.VideoCapture(0) # 開啟指定目錄中的影片檔 #原始影片中目標人員:24c360f9f54e7cb0001d #F:\KoDF\downsized\original_videos\original_videos\24c360f9f54e7cb0001d #被偽造的影片目錄-fsgan偽造方式 #F:\KoDF\downsized\synthesized_videos\synthesized_videos\fsgan\20201005\24c360f9f54e7cb0001d video_path = r"F:\KoDF\downsized\synthesized_videos\synthesized_videos\fsgan\20201005\24c360f9f54e7cb0001d\24c360f9f54e7cb0001d_19ea0e3a2325e8edce70_3_0010.mp4" cap = cv2.VideoCapture(video_path) # 確認影片是否成功開啟 if not cap.isOpened(): print ( f"無法開啟影片:{ video_path }" ) raise SystemExit # 自訂 ROI 的 Face Mesh landmark 編號 # left / right 是以「影片中人物本身」的左右側為準,不是以觀看畫面的左右側。...

人工智慧金融投資決策_期貨、選擇權、臺指期(TX)、臺指選(TXO)、衛生紙之亂(紙漿原物料)、令和米荒_利用python繪製買權/賣權選擇權投資組合交易的損益曲線

圖片
做一個暑期修課筆記,暑期這門課真的人超級多。 這學期暑期修課又接觸到跟期貨、選擇權有關的陌生術語,部分跟之前因緣際會有 接一個MT5小案子負責到 MetaTrader API串接 ,接觸到關於外匯一堆陌生術語有重疊。 需要一些這方面領域知識,才知道怎麼寫這塊程式。 現貨 日常舉凡去吃喝日常生活日用品消費、加油等等幾乎都是屬於現貨交易,直接當下一手交錢一手交貨。與現貨鄉反過來的就是期貨,可以理解為不是當下直接有需要的買賣交易行為。 期貨(高風險、高報酬->槓桿效用極大) 為一種標準化遠期合約,所謂遠期合約就是指, 買方跟賣方約定未來特定某日期,先預先決定好某個固定價格,對某個標的物(如股票指數、原油、黃金)做買賣的交易行為。 在當下做合約成立,於未來特定時間點執行交割。 以稻米期貨合約來舉例,買方如果跟某個農夫綁定期貨合約後,未來某個時間點 比方明年某月,我去用多少錢跟你買你這一畝田裡所有的米。 對於賣家(農夫、米農這些賣稻米期貨合約的人)而言,就可專心去耕種並確保預期日的交貨。 不用去擔心未來米可能有價格崩跌的問題,造成他前期耕種投入的米、肥料、農業機械設備、人力等成本會血本無歸。 對於買家(買稻米期貨合約的人)而言,也可以規避掉以後米價大漲、買不到米的風險,比方 供需斷鏈後,造成米價暴漲成天價的問題。 事實上在日本2024年時候就有缺米的案例 「令和米荒」事件  爆發,根據公視新聞當時紀載,日本米在那時翻倍漲。5公斤的米折合新台幣要價8、900元的高價。 而台灣在2018年時候也有爆發過 「衛生紙之亂」事件 ,根據自由財經新聞當時紀載,主要是因為進口長纖紙漿價格2月至5月仍維持在每噸920美元較高的價格,可以從這網頁 永豐金證券-原物料行情表 ,找到紙漿連結點進去看原物料行情歷史曲線圖。 2018年紙漿的價格曲線,有明顯維持足足3個月區間都坐落於932.5美元(元/噸) 相較於2026/7/18的655.0美元(元/噸),在當時衛生紙的原物料成本真的滿高的。 假如買方於當時買一斤米時100元,過了三個月或半年發掘已經漲到200元 這時候不妨思考,若米價未來大漲回不去的時候,就買家面是類似可抗通膨想法,但對於有投資想法的投機方,則會想的是若現在米價已經是大漲的情況下,我這份未來能買換到更便宜米價的期貨合約,也許可轉賣給別人去買,賺取價差。 在期貨交易市...