【掌控板】7.3、数组转化及存储

博客探讨了如何将整形数组转换为字符型数组,并存储到txt文件中。作者通过编写int转char函数,实现了int列表到字符串的转换,解决了write函数需要字符串输入的问题。在后续尝试中,作者调整了数据采样频率和存储方式,以适应内存限制,最终实现了一种动态存储策略。文章总结了目前的完成情况,包括高频率音频采样和txt文件存储,并列出了待办事项,如csv文件写入和数据容量测试。
摘要由CSDN通过智能技术生成

前言

将整形数组转换为字符型数组
需要用到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文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值