前言
将整形数组转换为字符型数组
需要用到insert,提取数组中对应序列号的数值
然后使用之前写的int转char函数
同时新增字符型数组存储到txt文件中
代码1_字符型数组存储到txt文件
参考之前写的【掌控板】3、向txt文件写入字符串、声音数据获取
#---------------------------------------------
# func8: 数组转化及存储
#
#---------------------------------------------
import os
path="test\\c.txt" #define file path
xxx = open(path,"a")
print(type(xxx))
sound_list=['12','123','1222']
print(sound_list)
print(type(sound_list))
xxx.write('sound_list\n')
#xxx.write(sound_list)
#file_mic.write("\n")
#print(file_mic.read())
print('write ok')
xxx.close()
结果1
报错,因为write需要输入的是字符串类型
参见2. 储存
file.write(“hello\n”) #如果要写入字符串以外的数据,先将他转换为字符串.
所以直接将list存到文件中行不通,需要先转换为字符串型
代码2——int型转字符型数组
#---------------------------------------------
# func9: 数组转化及存储(int型转字符型数组)
#
#---------------------------------------------
# MindPlus
# mpython
import os
# 十进制数字转换为字符
def int2char (x):
numbers = {
0 : '0',
1 : '1',
2 : '2',
3 : '3',
4 : '4',
5 : '5',
6 : '6',
7 : '7',
8 : '8',
9 : '9',
10 : 'a',
11 : 'b',
12 : 'c',
13 : 'd',
14 : 'e',
15 : 'f',
}
return numbers.get(x,None)
# 十进制int转十进制字符串
def int_2_dec( value , key_num):
a=value%key_num
result=''
#print("value",value)
if (a == 0) & (value == 0 ):
result = '0'
return result
#print("result",result)
#print("a!=0",a!=0)
#print("value > 0",value > 0)
while True :
if a == 0:
if value <= 0:
break
#print("enter")
#print("a",a)
temp=int2char(a)
#temp=hex(a).replace('0x','')
result=temp+result
#print("result",result)
value=(value-a)//key_num
#print("value",value)
a=value%key_num
#print("a",a)
return result
def intlist_2_char(intlist):
list_len=len(intlist)
char=''
print("list_len",list_len)
#1index=0
for index in range(list_len):
print("index",index)
temp=int_2_dec(intlist[index],10)
print("temp",temp)
char=char+'\n'+temp
print(char)
return char
path="test\\c.txt" #define file path
xxx = open(path,"a")
print(type(xxx))
sound_list=[1,2,3]
print(sound_list)
print(type(sound_list))
charlist=intlist_2_char(sound_list)
xxx.write('sound_list')
xxx.write(charlist)
#file_mic.write("\n")
#print(file_mic.read())
print('write ok')
xxx.close()
结果2
代码3——整合音量获取
#---------------------------------------------
# func10: 尝试利用数组将采样的数值进行存储(1s停止抓取数据)+数组转换
#
#---------------------------------------------
import ntptime,network
from mpython import*
from machine import Timer
# int型数组转换为字符串
def intlist_2_char(intlist):
list_len=len(intlist)
char=''
#print("list_len",list_len)
#1index=0
for index in range(list_len):
#print("index",index)
temp=int_2_dec(intlist[index],10)
#print("temp",temp)
char=char+'\n'+temp
#print(char)
print("-----stop change-----")
return char
# 十进制数字转换为字符
def int2char (x):
numbers = {
0 : '0',
1 : '1',
2 : '2',
3 : '3',
4 : '4',
5 : '5',
6 : '6',
7 : '7',
8 : '8',
9 : '9',
10 : 'a',
11 : 'b',
12 : 'c',
13 : 'd',
14 : 'e',
15 : 'f',
}
return numbers.get(x,None)
# 十进制int转十进制字符串
def int_2_dec( value , key_num):
a=value%key_num
result=''
#print("value",value)
if (a == 0) & (value == 0 ):
result = '0'
return result
#print("result",result)
#print("a!=0",a!=0)
#print("value > 0",value > 0)
while True :
if a == 0:
if value <= 0:
break
#print("enter")
#print("a",a)
temp=int2char(a)
#temp=hex(a).replace('0x','')
result=temp+result
#print("result",result)
value=(value-a)//key_num
#print("value",value)
a=value%key_num
#print("a",a)
return result
# 定义刷新函数,获取时间并显示
def Refresh(_):
print("-----in 1s-----")
global temp_num #定义全局变量
global sound_list
global status
status=0
temp_value=int_2_dec(temp_num,10)
print("temp_value",temp_value)
print("sound_list",len(sound_list))
print("-----start change-----")
result_char=intlist_2_char(sound_list)
print("result_char",result_char)
sound_list=[] # 需要清空数组,否则会报错内存不够
temp_num=0
return
temp_num=0
sound_list=[]
status=1
# 定时器1
tim1 = Timer(1)
# 初始化定时器1,设置时间1s,Timer.PERIODIC周期性,回调函数Refresh
tim1.init(period=1000, mode=Timer.ONE_SHOT, callback=Refresh)
while status :
temp_num=temp_num+1
sound_value_int=sound.read()
sound_list.append(sound_value_int)
# sound_value_char=int_2_dec(sound_value_int,10)
# print('sound',sound_value_char)
# oled.DispChar('sound', 0, 0, 1)
# oled.DispChar(sound_value_char, 0, 16, 1)
print("test end")
结果3
方法是ok的,但是我忘了一点,字符串存储又双叒叕超内存了。
打印index,查看最多能显示多少数据
所以尝试一次取2000个,用数组再存储吧。
代码4——基于代码2设置字符型数组存储
in [1, 2, 3, 4, 5, 6, 7]
out [’\n1\n2’, ‘\n3\n4’, ‘\n5\n6’, ‘\n7’]
#---------------------------------------------
# func12: 数组转化及存储(int型转字符型数组)+字符串数组
# in [1, 2, 3, 4, 5, 6, 7]
# out ['\n1\n2', '\n3\n4', '\n5\n6', '\n7']
#---------------------------------------------
import os
# 十进制数字转换为字符
def int2char (x):
numbers = {
0 : '0',
1 : '1',
2 : '2',
3 : '3',
4 : '4',
5 : '5',
6 : '6',
7 : '7',
8 : '8',
9 : '9',
10 : 'a',
11 : 'b',
12 : 'c',
13 : 'd',
14 : 'e',
15 : 'f',
}
return numbers.get(x,None)
# 十进制int转十进制字符串
def int_2_dec( value , key_num):
a=value%key_num
result=''
#print("value",value)
if (a == 0) & (value == 0 ):
result = '0'
return result
#print("result",result)
#print("a!=0",a!=0)
#print("value > 0",value > 0)
while True :
if a == 0:
if value <= 0:
break
#print("enter")
#print("a",a)
temp=int2char(a)
#temp=hex(a).replace('0x','')
result=temp+result
#print("result",result)
value=(value-a)//key_num
#print("value",value)
a=value%key_num
#print("a",a)
return result
def intlist_2_char(intlist):
list_len=len(intlist)
x_max=2
y_max=list_len//x_max+1
print("list_len",list_len)
print("x_max",x_max)
print("y_max",y_max)
char=''
char_list=[]
#1index=0
for index_y in range(y_max):
#print("index_y",index_y)
#print('\n')
if index_y == y_max-1 :
print('---in last list change xmax---')
x_max2=list_len%x_max
for index_x in range(x_max2):
#print("index_x",index_x)
index=index_x+x_max*index_y
#print("index",index)
temp=int_2_dec(intlist[index],10)
print("temp",temp)
char=char+'\n'+temp
else:
print('----xmax is 2----')
for index_x in range(x_max):
#print("index_x",index_x)
index=index_x+x_max*index_y
#print("index",index)
temp=int_2_dec(intlist[index],10)
print("temp",temp)
char=char+'\n'+temp
char_list.append(char)
print('char',char)
char=''
print("char_list",char_list)
print("char_list len",len(char_list))
return char_list
path="test\\c.txt" #define file path
xxx = open(path,"a")
print(type(xxx))
sound_list=[1,2,3,4,5,6,7]
print(sound_list)
print(type(sound_list))
charlist=intlist_2_char(sound_list)
xxx.write('sound_list')
charlist_len=len(charlist)
for index_list_len in range(charlist_len):
temp_list=charlist[index_list_len]
xxx.write(temp_list)
#xxx.write(charlist)
#file_mic.write("\n")
#print(file_mic.read())
print('write ok')
xxx.close()
结果4
转换成功,可以设置一行多少个,但是!!!字符串数组也是有内存限制的,我一开始还以为是字符串数组中的单个值有限制,利用数组可以放大n倍,哎,想来也是傻。
目前我能想到的方法是动态创建变量,然后再分配数据,利用数组存放这些变量的地址,用的时候取,不清楚这种方式能否成功。
但是我打算偷懒,直接将数据源变小,设置定时器为10ms,然后查看这些数据。
后续再尝试动态创建变量吧。(遥遥无期)
所以我设置这个分组的有什么意义吗,哎,还是不如直接用func11,func11测试到数据最多可以采2000个不超内存。
代码5
#---------------------------------------------
# func13: 整合2,修改了时间为140ms,采1977个数据,因为1s数据太多,即使是使用字符数组也一样,所以func11、12没啥用
#
#---------------------------------------------
import ntptime,network
from mpython import*
from machine import Timer
# int型数组转换为字符串
def intlist_2_char(intlist):
list_len=len(intlist)
x_max=2000
y_max=list_len//x_max+1
#print("list_len",list_len)
#print("x_max",x_max)
#print("y_max",y_max)
char=''
char_list=[]
#1index=0
for index_y in range(y_max):
#print("index_y",index_y)
#print('\n')
if index_y == y_max-1 :
print('====in last list change xmax====')
x_max2=list_len%x_max
for index_x in range(x_max2):
#print("index_x",index_x)
index=index_x+x_max*index_y
#print("index",index)
temp=int_2_dec(intlist[index],10)
#print("temp",temp)
char=char+'\n'+temp
else:
print('====xmax is 2====')
for index_x in range(x_max):
#print("index_x",index_x)
index=index_x+x_max*index_y
#print("index",index)
temp=int_2_dec(intlist[index],10)
#print("temp",temp)
char=char+'\n'+temp
char_list.append(char)
#print('char',char)
char=''
#print("char_list",char_list)
#print("char_list len",len(char_list))
return char_list
# 十进制数字转换为字符
def int2char (x):
numbers = {
0 : '0',
1 : '1',
2 : '2',
3 : '3',
4 : '4',
5 : '5',
6 : '6',
7 : '7',
8 : '8',
9 : '9',
10 : 'a',
11 : 'b',
12 : 'c',
13 : 'd',
14 : 'e',
15 : 'f',
}
return numbers.get(x,None)
# 十进制int转十进制字符串
def int_2_dec( value , key_num):
a=value%key_num
result=''
#print("value",value)
if (a == 0) & (value == 0 ):
result = '0'
return result
#print("result",result)
#print("a!=0",a!=0)
#print("value > 0",value > 0)
while True :
if a == 0:
if value <= 0:
break
#print("enter")
#print("a",a)
temp=int2char(a)
#temp=hex(a).replace('0x','')
result=temp+result
#print("result",result)
value=(value-a)//key_num
#print("value",value)
a=value%key_num
#print("a",a)
return result
# 定义刷新函数,获取时间并显示
def Refresh(_):
print("-----in 1s-----")
global temp_num #定义全局变量
global sound_list
global status
status=0
temp_value=int_2_dec(temp_num,10)
print("data num is ",temp_value)
#print("sound_list",len(sound_list))
print("-----change start-----")
result_char=intlist_2_char(sound_list)
#print("result_char",result_char)
print("-----change end-----")
# save
print("-----save start-----")
path="test\\c.txt" #define file path
xxx = open(path,"a")
xxx.write('sound_list')
charlist_len=len(result_char)
for index_list_len in range(charlist_len):
temp_list=result_char[index_list_len]
xxx.write(temp_list)
xxx.close()
print("-----save end-----")
# clear
sound_list=[] # 需要清空数组,否则会报错内存不够
temp_num=0
return
temp_num=0
sound_list=[]
status=1
# 定时器1
tim1 = Timer(1)
# 初始化定时器1,设置时间1s,Timer.PERIODIC周期性,回调函数Refresh
time_len=140
tim1.init(period=time_len, mode=Timer.ONE_SHOT, callback=Refresh)
print("time_len = ",time_len,'s')
print('start blow')
while status :
temp_num=temp_num+1
sound_value_int=sound.read()
sound_list.append(sound_value_int)
# sound_value_char=int_2_dec(sound_value_int,10)
# print('sound',sound_value_char)
# oled.DispChar('sound', 0, 0, 1)
# oled.DispChar(sound_value_char, 0, 16, 1)
print("test end")
结果5
小结
至此,当前完成状态如下:
1, mic采样频率可以达到14000hz
2, 采样的音频数据为int型,存到数组int_list中
3, 增加了int转char数组,鸡肋,只需要int数组转字符串即可(由于txt文件写入时需要转换为字符型)
待办
1, 尝试int数组写入csv文件
2, 找到数据的最大容量
3, 使用正弦波音频进行测试mic特性,是否可以生成wav文件