def init(): print("初始化開始") init_hz = [] # 欲存放初始頻率的空 list motor = PWM(Pin(25), duty=0) # 建立運轉馬達的 PWM 物件 for i in range(10): # 執行代表數字'0'~'9'的速度 motor.duty(400 + 50 * i) time.sleep(1) # 穩定轉速 fft = FFT(64, 4000, 34) # 採樣數 64、採樣頻率4000、指定腳位34 peak = fft.major_peak() # 判斷該數字對應速度的聲音頻率為何 print(peak) # 將初始頻率顯示出來, 判斷是否初始化成功 init_hz.append(peak) # 將初始頻率加入 list 內 motor.duty(0) # 暫停運轉 time.sleep(1) # 穩定停止 motor.deinit() # 停止運轉馬達的 PWM 功能 threshold = [] # 欲存放閾值的空 list for j in range(9): conti_ave = (init_hz[j] + init_hz[j + 1]) / 2 # 相鄰兩項相加的平均 threshold.append(conti_ave) # 加入閾值串列內 threshold.append(init_hz[9] + 100) # 數字'9'的頻率 + 100 print("初始化結束") return threshold # 回傳閾值陣列
def judge(mean_mag): low_exist = False # 判斷是否存在電話按鍵聲的低頻 high_exist = False # 判斷是否存在電話按鍵聲的低頻 fft = FFT(64, 3000, 34) magnitude = fft.magnitude() # 取得頻率強度 low_sum = sum(magnitude[13:22]) # 低頻區間的強度總和 high_sum = sum(magnitude[23:32]) # 高頻區間的強度總和 # 低頻與高頻平均強度是否大於環境頻率平均強度的1.4倍 if (low_sum / 9 > mean_mag * 1.5) and (high_sum / 9 > mean_mag * 1.5): for i in range(9): # 收集低頻區間連續兩個的頻率強度 low_conti = magnitude[13 + i] + magnitude[14 + i] # 收集高頻區間連續兩個的頻率強度 high_conti = magnitude[23 + i] + magnitude[21 + i] # 連續強度是否佔低頻區間的 30 %以上 if (low_conti > low_sum * 0.4): low_exist = True # 連續強度是否佔高頻區間的 30 %以上 if (high_conti > high_sum * 0.4): high_exist = True #確認出現電話按鍵聲, 執行 which_num 函式 if (low_exist == True) and (high_exist == True): occur = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 重置儲存次數陣列 which_num(occur) break
def which_num(): fft = FFT(128, 3000, 34) # 執行一次 low_peak = fft.interval_majorPeak(13, 23) # 判斷低頻的主頻率 high_peak = fft.interval_majorPeak(23, 33) # 判斷高頻的主頻率 for i in range(10): # 判斷低頻與高頻落在哪個區間內 if low_peak < low_loss[i]: # 篩選位於哪個低頻閾值 if high_peak < high_loss[i]: # 篩選出的低頻閾值中, 高頻聲音為何者 print((i + 1) % 10) # 輸出按鍵聲的號碼 break
def run_judge(ascii_unm, threshold): # 主程式中重複執行的部分 laser = PWM(Pin(25), freq=0) laser.freq(10 * ascii_unm) # ascii碼 個別數字運轉 time.sleep(0.1) fft = FFT(64, 4000, 34) # 採樣數 128、採樣頻率4000、指定腳位36 peak = fft.major_peak() # 判斷該數字對應速度的聲音頻率為何 laser.deinit() for i in range(127): if peak < threshold[i]: # 判斷落在哪一閾值內, 對應之索引便是該數字 print(i, end='') # 將判斷的數字印出 break # 停止迴圈
def which_num(occur): for j in range(10): fft = FFT(64, 3000, 34) # 執行一次 low_peak = fft.interval_majorPeak(13, 23) # 判斷低頻區間的主頻率 high_peak = fft.interval_majorPeak(23, 33) # 判斷高頻區間的主頻率 for i in range(10): # 判斷低頻與高頻落在哪個區間內 if low_peak < low_loss[i]: # 篩選位於哪個低頻閾值 if high_peak < high_loss[i]: # 篩選出的低頻閾值中, 高頻聲音為何者 occur[i] += 1 # 判斷出的數字出現次數 + 1 break print((occur.index(max(occur)) + 1) % 10) # 輸出判斷最多次的按鍵聲號碼
def run_judge(ascii_unm, threshold): # 主程式中重複執行的部分 motor = PWM(Pin(25), duty=0) motor.duty(400 + 50 * ascii_unm) # ascii碼 個別數字運轉 time.sleep(1) # 穩定轉速 fft = FFT(64, 4000, 34) # 採樣數 128、採樣頻率4000、指定腳位34 peak = fft.major_peak() # 判斷該數字對應速度的聲音頻率為何 motor.duty(0) # 停止運轉 motor.deinit() time.sleep(1) # 穩定停止 for i in range(10): if peak < threshold[i]: # 判斷落在哪一閾值內, 對應之索引便是該數字 print(i, end='') # 將判斷的數字印出 break # 停止迴圈
def init(): print("初始化開始") init_hz = [] # 欲存放初始頻率的空 list laser = PWM(Pin(25), freq=0) # 建立 pwm 物件 for i in range(127): # 執行代表 ASCII 碼 0 ~ 126 的頻率 laser.freq(10 * i) time.sleep(0.1) # 設定一點延遲時間, 防止錯誤 fft = FFT(64, 4000, 34) # 採樣數 64、採樣頻率4000、指定腳位34 peak = fft.major_peak() # 判斷該數字對應速度的聲音頻率為何 print(peak) # 將初始頻率顯示出來, 判斷是否初始化成功 init_hz.append(peak) # 將初始頻率加入 list 內 laser.deinit() threshold = [] # 欲存放閾值的空 list for j in range(126): loss = (init_hz[j] + init_hz[j + 1]) / 2 # 相鄰兩項相加的平均 threshold.append(loss) threshold.append(init_hz[126] + 100) # ASCII碼 126 初始頻率 +100 print("初始化結束") return threshold
if (low_sum / 9 > mean_mag * 1.5) and (high_sum / 9 > mean_mag * 1.5): for i in range(9): # 收集低頻區間連續兩個的頻率強度 low_conti = magnitude[13 + i] + magnitude[14 + i] # 收集高頻區間連續兩個的頻率強度 high_conti = magnitude[23 + i] + magnitude[21 + i] # 連續強度是否佔低頻區間的 30 %以上 if (low_conti > low_sum * 0.4): low_exist = True # 連續強度是否佔高頻區間的 30 %以上 if (high_conti > high_sum * 0.4): high_exist = True #確認出現電話按鍵聲, 執行 which_num 函式 if (low_exist == True) and (high_exist == True): occur = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 重置儲存次數陣列 which_num(occur) break fft = FFT(64, 3000, 34) #將第 0 項、第 1 項頻率強度刪除 magnitude = fft.magnitude()[13:32] #將該次 FFT 的平均強度加入 mean_mag mean_mag = sum(magnitude) / len(magnitude) while True: judge(mean_mag)
from flag_fft import FFT import time while True: fft = FFT(64, 4000, 34) # 建立 FFT 物件 peak = fft.major_peak() # 判斷主頻率 print(peak) time.sleep(0.1) # 等候 0.1 秒
from flag_fft import FFT import time #while True: fft = FFT(64, 4000, 34) # 建立 FFT 物件 #peak = fft.major_peak() # 判斷主頻率 #print(peak) for i in fft.magnitude(): print(i) time.sleep(0.1) # 等候 0.1 秒
from machine import Pin from flag_pwm import PWM from flag_fft import FFT import time while True: motor = PWM(Pin(25),duty=0) # 建立運轉馬達的 PWM 物件 speed = int(input("指定 duty 為:")) print("開始運轉") motor.duty(speed) # 運轉指定 duty 值的速度 time.sleep(1) # 持續 1 秒 fft = FFT(64,4000,34) peak = fft.major_peak() #輸出整體主頻率 print(peak) motor.deinit() # 停止運轉馬達的 PWM 功能 print("結束運轉, 待馬達完全停止再繼續輸入")