Exemple #1
0
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)  # 輸出判斷最多次的按鍵聲號碼
Exemple #6
0
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)
Exemple #9
0
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 秒
Exemple #11
0
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("結束運轉, 待馬達完全停止再繼續輸入")