- 2024-12-15
-
发表了主题帖:
【Follow me第二季第4期】通过IMU识别运动状态(上)
在之前的分享 【Follow me第二季第4期】任务二:IMU知识+IMU数据读取+IMU控制立方体 ,介绍了 Arduino® Nano RP2040 Connect 板载IMU运动传感器 LSM6DSOXTR的基本使用。
而选做任务二(非必做):通过IMU数据结合机器学习算法,识别运动状态,并通过串口打印。
LSM6DSOXTR是ST出的,官方提供了专门的软件,来进行训练,可是需要对应的开发板来支持。
相关的研究信息,可以查看了解:网友分享汇总(含作品)——2020年ST MEMS传感器创意设计大赛 - ST MEMS传感器创意设计大赛专区
好在ST官方提供了预训练的模型,可以在micropython的lsm6dsox支持库中,直接调用,非常的方便。
一、模型下载
ST官方给提供的预训练模型仓库地址:STMems_Machine_Learning_Core/application_examples/lsm6dsox
其中包含了多种预训练模型数据。
这里选取其中较为常用的两种:
1. Vibration monitoring
2. Head gestures
下载其中的ucf文件,放到开发板micropython环境的根目录:
二、模型调用代码
在 Arduino® Nano RP2040 Connect 官方提供的案例中,有对应的参考案例:MicroPython and the IMU Machine Learning Core Features | Arduino Documentation
要在micropython使用,需要参考 【Follow me第二季第4期】任务一:极简环境+快速烧录+花样点灯+结果输出+小知识 中安装micropython的OpenMV版本。
参考官方案例,稍作修改,对应的代码如下:
from lsm6dsox import LSM6DSOX
from machine import Pin, I2C
INT_MODE = True # 中断使能
INT_FLAG = False # 启动时,没有待处理中断
CHECK_TYPE = 0 # 0:Vibration Monitoring(振动监测) 1:Head gestures(头部动作识别)
# 定义中断处理函数.
def imu_int_handler(pin):
global INT_FLAG
INT_FLAG = True
# 配置外部中断(IMU)
if (INT_MODE == True):
int_pin = Pin(24)
int_pin.irq(handler = imu_int_handler, trigger = Pin.IRQ_RISING)
# 初始化I2C设备
i2c = I2C(0, scl=Pin(13), sda=Pin(12))
# 预训练模型配置
# 注意: 所选数据速率和比例必须与MLC数据速率和规模配置相匹配
if not CHECK_TYPE == 1:
UCF_FILE = "lsm6dsox_vibration_monitoring.ucf"
#UCF_LABELS = {0: "no vibration", 1: "low vibration", 2: "high vibration"}
UCF_LABELS = {0: "无振动", 1: "低振动", 2: "高振动"}
else:
UCF_FILE = "lsm6dsox_head_gestures.ucf"
UCF_LABELS = {0: "点头", 1: "摇动", 2: "静止", 3:"摇摆", 4:"步行"}
# 加载模型数据
lsm = LSM6DSOX(i2c, gyro_odr = 26, accel_odr = 26, gyro_scale = 2000, accel_scale = 4, ucf = UCF_FILE)
# 检测和输出
print("\n--------------------------------")
if not CHECK_TYPE == 1:
print("- 振动监测 -")
else:
print("- 头部姿势识别 -")
print("--------------------------------\n")
print("- MLC configured...\n")
while (True):
if (INT_MODE):
if (INT_FLAG):
# 检测到中断,读取MLC输出并将其转换为人类可读的描述
INT_FLAG = False
print("-", UCF_LABELS[lsm.mlc_output()[0]])
else:
buf = lsm.mlc_output()
if (buf != None):
print(UCF_LABELS[buf[0]])
在 LSM6DSOXTR 内部有机器学习决策单元:
当我们加载模型数据到其中时,就会根据触感器数据和模型来输出识别结果,从而被 Arduino® Nano RP2040 Connect 的主控RP2040获取到。
关于这两个模型的具体机器学习配置信息,可以查看:STMems_Machine_Learning_Core/application_examples/lsm6dsox/Vibration monitoring 和 STMems_Machine_Learning_Core/application_examples/lsm6dsox/Head gestures
三、使用识别效果
1. 振动监测:
当设置 CHECK_TYPE=0 时,使用振动监测模型,用于监测物体的振动情况,例如可以放在抽油烟机或者洗衣机上,或者工业机器上面,检测振动是否正常。
启动运行后,输出结果如下:
当用力敲击开发板,或者把开发板拿起砸几下,就会看到检测状态发生了而变化:
2. 头部运动识别
当设置 CHECK_TYPE=1 时,使用头部运动识别模型,这属于可穿戴设备的范畴,可以装上锂电,然后绑在头上测试。
启动运行后,输出结果如下:
如果左右转动头部,可以看到识别结果发生变化:
如果快速的摇头晃脑,则会出现如下的识别状态:
注意:摇头晃脑的时候,注意选择合适的位置,并手扶依靠物,一面头晕目眩不慎失足跌倒。
不过,点头和步行的两个动作,中途识别过几次,但是不能稳定的识别出来,可能与佩戴方式有关。
在ST官方提供的模型仓库中,还有其他的预训练模型,大家如果感兴趣的话,可以前去尝试。
不过,使用别人预训练的模型,总是觉得不如意,后面尝试使用 edgeimpulse 进行训练,看能否完成训练并进行实际部署使用。
-
发表了主题帖:
【Follow me第二季第4期】选做任务一:声音大小RGB效果呈现
在之前的分享 【Follow me第二季第4期】任务三:PDM麦克风小知识+数据读取+波形呈现+wav存储 ,用到了Arduino® Nano RP2040 Connect的PDM麦克风,在分享 【Follow me第二季第4期】任务一:极简环境+快速烧录+花样点灯+结果输出+小知识 中,用的Arduino® Nano RP2040 Connect的RGB LED。
两者结合,可以完成本次任务的要求:选做任务一(非必做):通过RGB LED不同颜色、亮度显示PDM麦克风收到的声音大小。
不过,需要注意的是,Arduino® Nano RP2040 Connect的RGB LED由 WiFiNina模块提供支持,目前仅支持普通GPIO的设置,也就是点亮或者熄灭,不支持PWM。
但是,Arduino® Nano RP2040 Connect板载的LED,对应D13(GPIO6),是RP2040直接控制的,支持PWM。
所以,完成该任务,颜色使用RGB LED,而亮度,则由载的LED来呈现。
一、点亮RGB LED
参考之前分享的代码即可:
from machine import Pin
import time
# 设定GPIO引脚
leds_name = (
"LEDR",
"LEDG",
"LEDB",
)
leds = [Pin(name, Pin.OUT) for name in leds_name]
HS = (
False,
False,
False
)
print("Hello DigiKey & EEWorld!")
index = 0
while True:
i = index % len(leds)
print(leds_name[i], leds[i], HS[i])
for n in range(len(leds)):
if n != i:
leds[n].value(not HS[n])
pass
leds[i].value(HS[i])
index += 1
time.sleep(0.3)
RGB LED每一个颜色都可以单独控制,从而可以呈现7种颜色,8种状态(含熄灭)。
二、PWM控制板载LED
使用PWM即可直接控制板载LED,一个常见的呼吸灯效果的代码如下:
from machine import Pin,PWM
import time
led_name = 'LED'
led = PWM(Pin(led_name))
led.freq(1000)
while True:
for i in range(0,65535,100):
led.duty_u16(i)
time.sleep_ms(1)
for i in range(65535,0,-100):
led.duty_u16(i)
time.sleep_ms(1)
运行上述代码后,板载的LED就会呈现呼吸灯的效果。
三、声音大小RGB效果呈现 + 亮度呈现
结合上述逻辑,以及PDM的数据读取逻辑,完成如下的代码:
from time import sleep, time
from machine import Pin, PWM
import st34dt05a as pdm
import sys
# 设定GPIO引脚
leds_name = (
"LEDR",
"LEDG",
"LEDB",
)
HS = (
False,
False,
False
)
VOLS = (130, 200, 300)
leds = [Pin(name, Pin.OUT) for name in leds_name]
led_name = 'LED'
led = PWM(Pin(led_name))
led.freq(1000)
for i in range(len(leds_name)):
for n in range(len(leds_name)):
if n != i:
leds[n].value(not HS[n])
pass
print(leds_name[i])
leds[i].value(HS[i])
sleep(0.3)
#sys.exit()
pcm_rate = 8_000 # Hz - default is 12kHz i.e. 3.072MHz bit-sample rate
pdm.bit_sample_freq = pcm_rate * 256
pdm_clk = Pin(23)
pdm_data = Pin(22)
record_flag = False
index=0
duty_n_pre = 0
duty_time = 0
def buffer_handler(inactive_buf):
global index, record_flag, duty_n_pre, duty_time
if record_flag:
buff = pdm.get_buffer(inactive_buf)
for i,n in enumerate(buff):
if index % 100 == 0:
#print(index, len(buff), i, n)
#print(n, end=" ")
print(n)
for j in range(len(leds_name)):
leds[j].value(not HS[j])
for j,vol in enumerate(VOLS):
if n >= vol:
leds[j].value(HS[j])
#break
duty_n = int((n if n > VOLS[0] else 0) / 512 * 65535 / 1000)
if duty_n != duty_n_pre:
if time() - duty_time > 1:
duty_n_pre = duty_n
duty_time = time()
print("设置PWM", duty_n)
led.duty_u16(duty_n * 1000)
#if index % 2000 == 0:
# print("")
index += 1
pdm.init(pdm_clk, pdm_data, handler=buffer_handler)
pdm.start()
sleep(1) # wait whilst StateMachine inits
print("Start record:")
record_flag = True
while True:
sleep(1)
record_flag = False
pdm.stop()
print("End record.")
在上述代码中,根据声音的范围,设置不同的颜色,点亮不同的RGB LED;
然后,再根据声音的大小,转换到PWM的duty设置,控制板载LED的亮度。
- 2024-12-14
-
回复了主题帖:
【Follow me第二季第4期】任务三:PDM麦克风小知识+数据读取+波形呈现+wav存储
怀66 发表于 2024-12-10 16:54
决定跟着大佬做这次作业了!刚好想用mpy做!!!谢谢大佬
加油。
mpy上手很好用的
-
回复了主题帖:
【Follow me第二季第4期】任务一:极简环境+快速烧录+花样点灯+结果输出+小知识
怀66 发表于 2024-12-10 16:50
谢谢大佬!!!,我就想用mpy开发,网上教程很少,我只找到了一点点例程。大佬分享的干货让我得以顺利上手 ...
micropython官方下载的版本即可,2022年就支持了的。
-
回复了主题帖:
【Follow me第二季第4期】任务一:极简环境+快速烧录+花样点灯+结果输出+小知识
yilonglucky 发表于 2024-12-11 11:04
学到了,感谢分享!这种是相当于在线Python解释器?可以离线独自运行吗?
完全没问题啊,写入到main.py,就能开机自动运行
- 2024-12-10
-
回复了主题帖:
【Follow me第二季第4期】任务二:IMU知识+IMU数据读取+IMU控制立方体
hellokitty_bean 发表于 2024-11-25 19:38
貌似马航的那个失事飞机飞行员,玩的就是那个软件。。。。。。。。是不是飞行员都在用那个模拟飞行软件就不 ...
那个做的确实好玩
- 2024-11-25
-
回复了主题帖:
【V2S200D 语音振动传感器评估套件测评】测评总结
秦天qintian0303 发表于 2024-11-25 08:41
选择性地拾取说话者的声音这个还是有点疑虑的,毕竟噪音也能引起震动啊
人声引起的振动,和噪音引起的振动,还是有很大差别的。
-
回复了主题帖:
【V2S200D 语音振动传感器评估套件测评】测评总结
秦天qintian0303 发表于 2024-11-25 08:41
选择性地拾取说话者的声音这个还是有点疑虑的,毕竟噪音也能引起震动啊
还有后续处理过程嘛。
- 2024-11-24
-
回复了主题帖:
【V2S200D 语音振动传感器评估套件测评】测评总结
Lumixs 发表于 2024-11-24 20:08
点赞11111111111111111111111111111111111
多谢大佬!
-
回复了主题帖:
【Follow me第二季第4期】任务一:极简环境+快速烧录+花样点灯+结果输出+小知识
ly87802541 发表于 2024-11-24 16:09
很详细nice
希望能帮到大家
-
回复了主题帖:
【Follow me第二季第4期】任务三:PDM麦克风小知识+数据读取+波形呈现+wav存储
Jacktang 发表于 2024-11-24 09:34
已经有Arduino® Nano RP2040 Connect的使用者,制作了专门的驱动,看来前期的使用者是比较用心的
是的,micropython就是这么爽,玩的人多
-
发表了主题帖:
【V2S200D 语音振动传感器评估套件测评】测评总结
这次申请参加 【V2S200D 语音振动传感器评估套件(KAS-33100-0007)】的测评,并有幸中选:测评入围名单:V2S200D 语音振动传感器评估套件(KAS-33100-0007)。
收到评估套件之后,学习研究其具体使用,并开展了多项评估测验工作。
评估测验分享具体如下:
1. 基础使用:
【V2S200D 语音振动传感器评估套件测评】开箱报告
【V2S200D 语音振动传感器评估套件测评】测试软件使用及单麦克风测试
【V2S200D 语音振动传感器评估套件测评】双麦克风测试
2. 应用场景测试:
【V2S200D 语音振动传感器评估套件测评】自行车头盔测试
【V2S200D 语音振动传感器评估套件测评】手机耳机模式测试
【V2S200D 语音振动传感器评估套件测评】TWS耳机模式测试
【V2S200D 语音振动传感器评估套件测评】麦当劳玩具对讲机内壁测试
3. 工业场景测试:
【V2S200D 语音振动传感器评估套件测评】工业测试之洗衣机
【V2S200D 语音振动传感器评估套件测评】工业测试之抽油烟机
4. 环境测试:
【V2S200D 语音振动传感器评估套件测评】多种现场环境声音测试
5. 工具测试:
【V2S200D 语音振动传感器评估套件测评】Audacity工具测试
上述11篇分享,评估测评了V2S200D 语音振动传感器评估套件的方方面面,对V2S200D 语音振动传感器也有了深入的了解。
与传统的声音传感器不同,V2S200D 语音振动传感器不需要直接接收到声波信号,而是通过介质,来通过声波对介质产生的振动获取信号,从而进行声音信号的拾取。
通过实际测评结果,可以明确的了解,V2S200D 语音振动传感器 完全能够选择性地拾取说话者的声音,同时抑制所有其他声音,从而提供舒适且无顿挫的语音通话体验。
因为它不需要直接接收声波信号,从而无需要保留传统的声音接触通道(如小孔),可以在完全密闭的场合使用,从而使得其可以适应各种应用场合,包括环境恶劣的场合。
这次对 V2S200D 语音振动传感器评估套件 的测评,非常的开心和满意,期待今后还能有类似的测评机会,继续开心的参与。
-
发表了主题帖:
【V2S200D 语音振动传感器评估套件测评】Audacity工具测试
在之前对V2S200D 语音振动传感器评估套件的一系列测试中,都使用了官方提供的Demo工具。
在实际使用中,做音频处理,Audacity是最常见的一个工具了,能够跨平台使用。
现在就来试试,在 Audacity 中,使用V2S200D 语音振动传感器。
一. 安装Audacity
直接访问: Audacity ® | Downloads (audacityteam.org) ,下载对应操作系统的版本安装即可。
安装完成后,直接点击图标启动:
二、设置音频参数
启动Audacity后,需要进行简单的设置,才能使用V2S200D 语音振动传感器。
首先设置录音设备:
然后设置声道:
根据使用传感器是单个还是双的进行设置。
其他的录音参数,如采样率等,就暂时需要设置了。
三、录制声音
设置完了以后,就可以开始录制声音了。
在操作界面中,先点击下图中的(1),然后可以说话,等录制结束的时候,再点途中的(2):
录制完成后,结果如下:
在这个界面中,音频波形图变化幅度很窄,可以将波形区域的高度拉高一些:
然后,在左边的刻度区域,点鼠标右键,点放大,放大到合适的大小即可:
四、声音处理
在Audacity中,可以进行多种效果设置。
EQ平衡:
降噪处理:
处理后的结果如下:
可以点击如下的按钮,播放视听效果:
然后,音频区域的左边消息栏,点右上角的...:
然后选择频谱图,即可显示对应的频谱图:
这个频谱图,就和V2S官方Demo中频谱图类似了。
五、总结
经过上面的步骤,就可以在Audacity工具中,使用V2S200D 语音振动传感器来采集声音数据了。
结合不同的实际环境和应用场合,就能进一步做到类似官方Demo中的测试评估了。
-
发表了主题帖:
【V2S200D 语音振动传感器评估套件测评】麦当劳玩具对讲机内壁测试
一、声音传感器与小孔
在常见的玩具中,要做声音的拾取,一般都需要留一个小孔,例如:
因为这些语音传感器,都需要接收到声波,将声音信号转换为电信号或将电信号转换为声音信号,从而实现语音的拾取。
而V2S200D 语音振动传感器,则直接通过振动,来拾音声音信号的拾取,没有孔,也能拾取声音。
二、玩具加装V2S200D语音振动传感器
之前麦当劳玩具对讲机火爆的时候,我第一时间抢购了一套:
那这次,就拿左边这个红色+黄色的来做测试设备:
先把这个对讲机给拆开:
在把V2S200D语音振动传感器找个合适的位置,安装进去:
把传感器用透明胶,粘贴到前壳内壁:
最后再把对讲机给装好,并连上评测套件:
现在加装好了,就可以开始测试了。
三、普通环境声音数据收集
同样的,先设置好信号采集设备:
然后采集信号:
降噪处理后的结果:
实际播放处理前和处理后的音频,其差异为处理前有明显的背景噪音,而处理后,声音有一些空旷感,但人声则非常明显,噪音辈明显抑制。
这个声音的空旷感,可能是由外壳形状和材料所决定,暂时没有细究。
四、嘈杂环境声音采集
现在,再切换到一个嘈杂的环境--咖啡厅,进行测试。
先进行数据采集:
相比在前面的普通环境中测试的结果,现在这个噪音非常明显了,不管是看时域图还是频谱图。
再看看处理后的结果:
处理前和处理后的结果对比,可以看到,噪音信号显著抑制了,从而使人声信号得到了加强。
实际播放音频的结果,处理前智能听到微弱的人声,而处理后,虽然还有少部分背景音乐和人声,但我说话的声音则非常的清晰,噪音就基本没有了。
五、总结
通过这一次的测试,可以了解到,使用V2S200D 语音振动传感器,仅需要将其紧贴外壳,即可拾取声音信号,再也不用像之前的声音传感器那样,要开一个小孔对准声音传感器了。
少了这个小孔,对玩具会有很大的提升,其防水能力显著提高,并且结构设计上,也不用考虑小孔的特殊安排了。
不仅仅是玩具,在其他类似需要声音传感器拾取声音的场合,都可以应用,而且拾取人声的效果,也非常的好。
-
发表了主题帖:
【V2S200D 语音振动传感器评估套件测评】多种现场环境声音测试
V2S200D 语音振动传感器评估套件可以评测的范围,非常的广泛。
这一次的评测,就在多个现场环境中进行测试,看看其效果如何。
一、热闹的咖啡厅
老实说,咖啡厅按道理,不应该人声鼎沸。但是现在的咖啡厅,都成了热闹的集市了:
降噪平衡处理结果:
二、潺潺流水的山沟沟
周末正好想放松放松,去山里面,所以就这个机会,测试了一下在溪水环境下的情况:
降噪平衡后的结果:
三、车水马龙的街头
街头也是一个很常见的嘈杂环境,走,去街头采集一下声音数据:
降噪平衡后的结果:
四、沸反盈天菜市场
周末大早上的,趁着买菜的机会,在菜市场也测试了一把:
降噪平衡后的结果:
五、人来人往的火车站广场
顺道路过火车站,这也是个非常嘈杂的环境,正好测试一番:
降噪平衡后的结果:
六、结果分析
从以上五种现场环境的测试结果来看,各个环境下的环境噪音各不相同,有的较为平缓,有的比较激烈,从频谱图可见一斑。
直接查看原始数据,可以看到人声混在背景噪声中,大多数情况下,基本是没法区分的。
经过降噪处理和平衡之后,人声得到了很好的分离和加强,噪音抑制非常的明显。
经过实际播放处理前后的音频可以听出来,即使在噪音嘈杂激烈的环境,经过处理后,略微带有一些噪音,但人声则非常显著,区分度非常非常的高。
因此,在实际环境中,V2S传感器获得的数据,经过处理后,能够较好的拾取说话的人声,而抑制其他的声音。
-
发表了主题帖:
【V2S200D 语音振动传感器评估套件测评】手机耳机模式测试
V2S200D 语音振动传感器评估套件可以用于物体表面的测试,还能够直接用于手机耳机模式的测试,来评估把手机放在耳边使用时的拾音效果。
那么这次,我们就来试试手机耳机模式。
一、连接传感器
按照下图,将传感器粘贴在手机的背后:
二、声音数据采集
连接好传感器以后,就可以把收集拿起来,像日常使用一样,和其他人正常通话,并使用测试软件进行数据采集。
同样的,先设置好数据采集设备:
然后采集数据:
从上面采集结果的频谱图中,可以看到,V2S传感器采集的数据要更加的显著。
三、采集数据处理
点击Process,查看经过处理后的结果:
经过处理后,频谱图中的噪音数据,明显减少。
实际播放,同样是V2S的结果人声清晰,基本无杂音噪音了。
从上面的测试,也可以了解,V2S传感器应用于手机上,在耳机模式下使用,效果也是非常的不错。
-
发表了主题帖:
【V2S200D 语音振动传感器评估套件测评】TWS耳机模式测试
本帖最后由 HonestQiao 于 2024-11-24 15:39 编辑
V2S200D 语音振动传感器评估套件中,还提供了TWS耳机测试的模块,具体如下:
该模块通过振动收集声音信号,进行处理。同事自身还提供了MIC,以便进行对比测试。
一、普通环境数据收集
首先,在普通环境下,采集声音信号数据进行测试。
找一位美女,将耳机部分佩戴好:
然后按照正常的使用模式说话,并采集数据。
采集前,依然先进行采集设备设置:
然后录制数据:
上图中,左边的是MIC采集的数据,右边是V2S传感器采集的数据:
在普通环境下,两者差别不大。
再看看进行处理后的数据:
经过降噪、均衡处理后的结果,进行别放试听,并结合图形查看,可以看到,V2S传感器最终得到的声音数据中,人生更为突出,会更加的通透,背景噪声几乎没有了。
二、嘈杂环境数据收集
这次的测试,在一个嘈杂的咖啡厅环境测试,先采集数据:
从上面的结果中可以看到,MIC采集的数据,噪音明显较多,而V2S传感器采集的而数据,则噪音明显较少。
然后再看看警告牌处理后的结果:
从上面的结果中可以看到,最终得到的V2S传感器信号数据,声音特征非常突出集中,实际播放,夜视效果非常的好,完全没有环境的早噪声了。
通过上面的测试,可以了解到,V2S传感器,在耳机应用场合也是非常的优秀的。
在嘈杂的环境中,能够更好的收集说话者的声音,经过处理后,能够获得更好的降噪效果。
- 2024-11-23
-
回复了主题帖:
【Follow me第二季第4期】进阶任务二 imu机器学习识别运动状态
可以去学习研究,知其所以然的。
-
发表了主题帖:
【Follow me第二季第4期】任务三:PDM麦克风小知识+数据读取+波形呈现+wav存储
Arduino® Nano RP2040 Connect提供了一颗PDM麦克风,可以用于声音的录制,这一篇就分享如何在micropython中使用这颗PDM麦克风。
一、PDM麦克风小知识
Arduino® Nano RP2040 Connect上的PDM麦克风的型号是MP34DT06JTR,不出意外,它又是ST提供的。
其具体位于板子上如下位置:
和之前的IMU传感器类似,使用的也是IIC接口,从Pinout可以了解:
从ST官方资料可以了解的具体信息:
MP34DT06J 是一款超紧凑、低功耗、全向、数字 MEMS 麦克风,采用电容式传感元件和 IC 接口构建。
能够检测声波的传感元件采用专用于生产音频传感器的专用硅微加工工艺制造。
IC 接口采用 CMOS 工艺制造,允许设计能够以 PDM 格式从外部提供数字信号的专用电路。
MP34DT06J 是一款低失真数字麦克风,具有 64 dB 信噪比和 –26 dBFS ±1 dB 灵敏度。
使用该麦克风,常用的应用逻辑如下:
而PDM麦克风的内部处理框图如下:
当通过PDM麦克风获取音频信号时,是对音频模拟信号,进行了脉冲密度调制:(PDM是一种调制形式,用于表示数字域中的模拟信号。它是1位数字采样的高频数据流。在 PDM信号中,脉冲的相对密度对应于模拟信号的幅度。大量的'1'对应于高(正)幅度值, 而大量的'0'对应于低(负)幅度值,交替的'1'和'0'对应于幅度值0)
实际上,我们要应用它,是通过IIC接口,从其获得经过处理后的数据即可。
二、使用板载PDM麦克风获取声音信号
在Arduino开发环境中,Arduino® Nano RP2040 Connect的定制环境,提供了MP34DT06JTR的PDM驱动接口。
但是在定制的micropython环境中,没有提供对应的PDM驱动接口。
经过了解,已经有Arduino® Nano RP2040 Connect的使用者,制作了专门的驱动,可以从这个地址下载: PinkInk/mp34dt05-a-micropython-driver: PDM Microphone on Arduino Nano
下载后,将 st34dt05a.py 放置到 Arduino® Nano RP2040 Connect 的micropython 环境对应的U盘根目录下的/lib目录中:
在 st34dt05a.py 中,使用的RP2040的PIO状态机编程来进行数据的读取,这样效率更高:
做好以上准备后,再编写下面的测试程序:
from time import sleep
from machine import Pin
import st34dt05a as pdm
pcm_rate = 8_000 # Hz - default is 12kHz i.e. 3.072MHz bit-sample rate
pdm.bit_sample_freq = pcm_rate * 256
pdm_clk = Pin(23)
pdm_data = Pin(22)
record_flag = False
index=0
def buffer_handler(inactive_buf):
global index, record_flag
if record_flag:
buff = pdm.get_buffer(inactive_buf)
for i,n in enumerate(buff):
if index % 100 == 0:
#print(index, len(buff), i, n)
print(n, end=" ")
if index % 2000 == 0:
print("")
index += 1
pdm.init(pdm_clk, pdm_data, handler=buffer_handler)
pdm.start()
sleep(1) # wait whilst StateMachine inits
print("Start record:")
record_flag = True
while True:
sleep(1)
record_flag = False
pdm.stop()
print("End record.")
上面的代码中,先设置采样率,然后启动pdm数据采样,并在中断回调handler中,输出获取到的数据。
对中断回调中,应该快速处理,所以才用使用了计数器,每100次才输出一次采集到的数据,每2000次输出换行。
为了放置输出的数据过多,设置了每计数100次输出打印一次。
运行后,输出结果如下:
靠近麦克风说话,就能看到数据发生变化了。
三、音频波形数据呈现
上面只是将数据给直接输出了,还可以再进一步,将输出的数据,用波形图的方式呈现出来。
如果使用Thonny开发工具,可以很方便的将输出的数据呈现为音频波形。
先将上面的程序,做一点小的修改,修改buffer_handler:
def buffer_handler(inactive_buf):
global index, record_flag
if record_flag:
buff = pdm.get_buffer(inactive_buf)
for i,n in enumerate(buff):
if index % 100 == 0:
#print(index, len(buff), i, n)
#print(n, end=" ")
print(n * 2)
#if index % 2000 == 0:
# print("")
index += 1
然后把Thonny的绘图器打开:
再运行代码,就可以看到音频波形图了:
[localvideo]86e2d4167e160c42c0d8468d00c58b77[/localvideo]
再呈现必行的过程中,大声说话,就可以看到变化了。
四、wav文件存储
录制到了音频信号数据,一般还需要转换为wav格式,方便存储和播放,或者进一步处理。
在 PinkInk/mp34dt05-a-micropython-driver: PDM Microphone on Arduino Nano 中,还提供了一个简单的wav处理模块:
可以用于将采集到的音频信号数据,存储为wav文件。
在上面程序的基础上,做一些修改,引入该模块,并进行调用:
from time import sleep
from wavsimple import wav
from machine import Pin
import st34dt05a as pdm
pcm_rate = 8_000 # Hz - default is 12kHz i.e. 3.072MHz bit-sample rate
pdm.bit_sample_freq = pcm_rate * 256
pdm_clk = Pin(23)
pdm_data = Pin(22)
w = wav('output.wav', SampleRate=pcm_rate)
record_flag = False
index = 0
def buffer_handler(inactive_buf):
global index, record_flag
if record_flag:
buff = pdm.get_buffer(inactive_buf)
w.write(buff)
pdm.init(pdm_clk, pdm_data, handler=buffer_handler)
pdm.start()
sleep(1) # wait whilst StateMachine inits
print("Start record:")
record_flag = True
sleep(5)
record_flag = False
pdm.stop()
w.close()
print("End record.")
上面的代码中,调用了wavsimple.wav来进行数据的保存。
因为在中断调用中,要快速处理,所以把原有的打印输出给去掉了,只保存数据到wav文件,确保快速处理。
运行后,输出结果如下:
在 Arduino® Nano RP2040 Connect 的U盘设备中,会出现一个新的文件:
打开这个文件,就可以听到录制的音频数据了。
不过,直接录制的音频数据,噪点较多,可以考虑用一些消除噪音的算法,来降噪处理。
例如使用下面的简单均值滤波算法:
def mean_filter(data, window_size=3):
filtered_data = []
half_window = window_size // 2
for i in range(len(data)):
start = max(0, i - half_window)
end = min(len(data), i + half_window + 1)
window = data[start:end]
filtered_value = sum(window) // len(window)
filtered_data.append(filtered_value)
return bytes(filtered_data)
-
回复了主题帖:
【Follow me第二季第4期】任务二:IMU知识+IMU数据读取+IMU控制立方体
秦天qintian0303 发表于 2024-11-22 21:00
再来一个就完成了,前三个传感器学习还是挺不错得
是的是的,这几个传感器,多个环境都能很方便的调用。