2020-12-08

本文详细介绍了Linux音频子系统中tinyalsa库及其提供的tinymix、tinyplay、tinycap和tinypcminfo四个工具的使用方法。在Android系统中,tinyalsa作为ALSA的简化版,用于控制和管理音频通路。tinypcminfo用于查看PCM通道信息,tinymix用于配置音频参数,tinyplay用于播放音频,tinycap则用于录音。通过这些工具,开发者可以方便地进行音频系统的调试和测试。

tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)

 

目前linux中主流的音频体系结构是ALSA(Advanced Linux Sound Architecture),ALSA在内核驱动层提供了alsa-driver,在应用层提供了alsa-lib,应用程序只需要调用alsa-lib提供的API就可以完成对底层硬件的操作。说的这么好,但是Android中没有使用标准的ALSA,而是一个ALSA的简化版叫做tinyalsa。Android中使用tinyalsa控制管理所有模式的音频通路,我们也可以使用tinyalsa提供的工具进行查看、调试。

编译tinyalsa后生成四个小工具:

  1. tinymix

  2. tinyplay

  3. tinycap

  4. tinypcminfo

 

编译命令:

mmm external/tinyalsa/


 

下面依次演示一下四个小工具的使用:(以下使用联芯科技的LC1860平台配合LC1160电源+音频芯片,截图及演示效果均来自M7301P5测试机)

1,  tinypcminfo

tinypcminfo用于查看pcm通道的相关信息

输入:

tinypcminfo -D /proc/asound/cards

 

结果如下:

从上面获得的信息中可以知道PCM的采样率,通道个数,采样点数等信息。

其中 –D 后边跟的参数为声卡文件,一般位于/proc/asound/cards。可以使用

cat /proc/asound/cards

查看当前声卡

 

 

2,  tinymix

如下图所示,直接输入tinymix可以得到音频通路相关的各项配置参数。也可以通过添加参数修改其中的配置,如希望提高ADC1 Gain值到110,输入tinymix 12 110即可。

 

单独查看上述信息比较难以梳理,配合音频通路图会更加清晰。

 

上图中红色字体标明了LC1160与麦克风、耳机等硬件设备的连接关系。(注:M73xx项目由于内部ClassD不满足要求,喇叭连在了AUX通路上)

各个通路上的增益调节部分使用绿色字体标出了与tinymix中选项的对应关系。

图中加号与Mux是通路选择开关,对应tinymix中的其它的选项,用于在各种模式下切换音频通道。此部分比较多没有在图中一一标出,但根据已知的通路名是比较容易对应的。

图中黄色箭头标出的是通话时下行音频数据流,从PCM接口进入到LC1160,然后经过MonoDAC进行数模转化后送到听筒。

图中紫色箭头标出的是通话时上行音频数据流,从主MIC采集声音后,经过ADC1进行模数转换后由PMC的DO线送出

3,  tinyplay

 

tinyplay是一个简易的音乐播放器,一般用于播放测试。tinyplay只能播放wav原始格式的音乐,不能进行Mp3等格式的解码,支持44.1kHz,48kHz采样率的wav音乐。

在调用tinyplay播放音乐之前需要先使用tinymix切换好音频通路:

  1. tinymix 0 I2SR //选择Stereo DACR的音源为i2s

  2. tinymix 1 I2SL //选择Stereo DACL的音源为i2s

  3. tinymix 2 0 0 //将Stereo DAC左右声道的mute关闭

  4. tinymix 24 1 //开启喇叭的外部PA芯片

  5. tinymix 40 1 //将Stereo DACR的声音路由到AUX口输出(因为实验机器喇叭挂载AUX接口上)

  6. tinymix 41 1 //将Stereo DACR的声音路由到AUX口输出(因为实验机器喇叭挂载AUX接口上)

  7. tinyplay z.wav

 

4,  tinycap

tinycap是一个简易的录音软件,一般用于录音测试。

在调用tinycap录音之前需要先调整好音频通路:

  1. tinymix 14 30 //mic1 volume

  2. tinymix 19 1 //mic1 boost on

  3. tinymix 26 1 //adc1 -> mic1

  4. tinymix 50 ADC1 //i2sR out -> adc1

  5. tinymix 51 ADC1 //i2sL out -> adc2

  6. echo "0xfb 0x01" > /sys/devices/platform/comip_codec/lc1160_reg //bias poweron

  7. echo "0xad 0x08" > /sys/devices/platform/comip_codec/lc1160_reg //adc1 enable

  8. echo "0xac 0x01" > /sys/devices/platform/comip_codec/lc1160_reg //mic1 pga enable

  9. echo "0x3b 0xcc" > /sys/devices/platform/comip_codec/lc1160_reg //ldo

  10. echo 2 > /sys/bus/i2c/drivers/fm2018/0-0060/mode //bypass 外部的回声消除音频芯片(M730x项目特有)

  11.  
  12. tinycap /sdcard/Music/l.wav

 

录音结束通过ctrl+C强行退出即可,之后在/sdcard/Music/路径下查看到l.wav音频文件

使用adb pull到本地电脑中,使用goldwave播放、查看。

adb pull /sdcard/Music/l.wav d:\



 

另外:

LC1160的寄存器是分页的,即同一个地址上存在两个不同含义的寄存器,通过控制0xFC寄存器中的值来切换到第二功能页

  1. echo "0xfc 0x01" > /sys/devices/platform/comip_codec/lc1160_reg

  2. cat /sys/devices/platform/comip_codec/lc1160_reg

  3. echo "0xfc 0x00" > /sys/devices/platform/comip_codec/lc1160_reg

感谢你提供的列名信息,我们可以看到: - `"...1"`:可能是 Excel 中第一列无标题的自动命名(比如行号或空列),可以忽略。 - `"STATION"`:站点编号 - `"NAME"`:站点名称 - `"LATITUDE"`:纬度 - `"LONGITUDE"`:经度 - `"ELEVATION"`:海拔 - `"statement"`:可能是一个状态或注释字段 - 后续从 `"2020-01-01"` 到 `"2020-01-31"` 是每日风速数据(共31天) --- ### ✅ 目标更新: 你要做的是:**根据给定的 SHP 范围裁剪站点,保留落在该地理范围内的所有站点及其完整的逐日风速数据。** 下面是适配你实际列名的完整 R 语言代码,并处理好坐标、投影和数据结构问题。 ```r # 加载所需包 library(sf) library(readxl) library(dplyr) # ------------------- 参数设置 ------------------- excel_file <- "your_wind_station_data.xlsx" # 替换为你的实际文件路径 sheet_name <- "Sheet1" # 替换为你的工作表名 shp_file <- "your_boundary.shp" # 替换为你的SHP文件路径 # ------------------- 步骤1: 读取Excel数据 ------------------- df <- read_excel(excel_file, sheet = sheet_name) # 查看列名确认 names(df) <- make.names(names(df)) # 确保列名是合法的(防止空格等问题) cat("原始列名:\n"); print(names(df)) # ------------------- 步骤2: 提取空间信息并创建sf对象 ------------------- # 使用 LATITUDE 和 LONGITUDE 创建空间点(注意:顺序是 LON, LAT) stations_sf <- st_as_sf(df, coords = c("LONGITUDE", "LATITUDE"), # 经度在前,纬度在后 crs = 4326, # WGS84 地理坐标系 dim = "XY") # ------------------- 步骤3: 读取SHP边界并确保其CRS ------------------- boundary <- st_read(shp_file) # 如果boundary不是投影坐标系(如EPSG:32649),则需要检查并转换 # 假设你知道目标投影是 UTM Zone 49N (EPSG:32649),我们统一到这个坐标系进行空间操作 if (is.na(st_crs(boundary))) { stop("SHP文件没有坐标系信息,请先定义正确的CRS!") } # 将站点数据重投影到与SHP相同的坐标系下进行空间判断 stations_projected <- st_transform(stations_sf, crs = st_crs(boundary)) # ------------------- 步骤4: 空间裁剪 —— 找出在SHP范围内的站点 ------------------- # 使用 st_intersects 或 st_within 进行空间子集提取 # 这里使用 [s,t] 语法:返回落在任意多边形内的站点 stations_clipped <- stations_projected[boundary, , op = st_intersects] # 若你想更严格地要求“完全包含”,可用 st_within,但通常 st_intersects 更通用 # ------------------- 步骤5: 转回原始经纬度并提取属性表格 ------------------- # 将结果转回WGS84以便保留原始经纬度格式输出 stations_wgs84 <- st_transform(stations_clipped, crs = 4326) # 去掉geometry列,恢复为普通data.frame,同时保留原始所有列(包括每日数据) result_df <- st_drop_geometry(stations_wgs84) # 可选:重新排序列,把时间序列放在后面 date_cols <- grep("^\\d{4}-\\d{2}-\\d{2}", names(result_df), value = TRUE) non_date_cols <- setdiff(names(result_df), date_cols) final_df <- select(result_df, c(non_date_cols, date_cols)) # 按逻辑排序 # ------------------- 步骤6: 导出结果 ------------------- write.csv(final_df, "clipped_stations_202001.csv", row.names = FALSE, na = "") cat("共保留了", nrow(final_df), "个站点在SHP范围内。\n") ``` --- ### ✅ 关键说明: | 功能 | 说明 | |------|------| | `coords = c("LONGITUDE", "LATITUDE")` | 必须是 **经度在前,纬度在后**,否则位置错误! | | `crs = 4326` | 表示输入的经纬度使用 WGS84 坐标系 | | `st_transform(...)` | 将点从地理坐标(度)转为投影坐标(米),确保与 SHP 在同一空间参考下比较 | | `st_intersects` | 判断点是否与多边形相交(即落在内部),适用于大多数情况 | | `st_drop_geometry()` | 移除空间结构,得到纯数据框用于导出 | > 💡 输出的 CSV 文件将包含原始所有列,包括 `STATION`, `NAME`, `LATITUDE`, `LONGITUDE`, `ELEVATION`, `statement` 和所有日期列(如 `2020-01-01` 等),仅保留位于 SHP 范围内的站点。 --- ### ✅ 示例输出片段(final_df 头几行): ``` ...1 STATION NAME LATITUDE LONGITUDE ELEVATION statement 2020-01-01 2020-01-02 ... 1 1 101 Beijing 39.90 116.4 50.0 good 3.2 4.1 2 2 102 Tianjin 39.08 117.2 10.0 good 5.0 3.8 ... ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值