raw data/PF data/Q30 data/clean data的不同

本文介绍了测序数据的不同阶段,包括原始数据、PF数据、Q30数据和干净数据。原始数据是未经处理的全部测序信息,PF数据通过质控筛选保留高质量片段,Q30数据则进一步确保碱基识别的99.9%可靠性,而干净数据是在PF数据基础上根据特定标准进行深度清理后的结果。

测序数据拿回来之后,会给一些数据。那么这些数据代表什么呢?

1. 原始数据(Raw data):一次测序产生的全部原始数据。理论上,它们应该是没有经过任何过滤的,无论好坏。


GB和Gb的区别

2. PF数据(PF data):在测序过程中,Illumina内置软件根据每个测序片段(read,通常每个片段长100个碱基)前25个碱基的质量决定该read是保留还是抛弃。如果没有达到质控标准,则该read的全部碱基都被抛弃;达到标准、保留下来的数据叫做PF data。 PF代表pass filtering。

3. Q30数据(Q30 data):Illumina内置软件根据统一设定的标准来评判碱基识别结果的可靠性,为每个碱基给予一个质量评分(QV)。PF data里质量评分>=30分的数据称为Q30 data。 Q30的意思是该碱基的可靠性为99.9%。Q30数据通常占PF数据的80%左右。视样本质量、操作水平、试剂质量、仪器状态的不同,这一比例有很大波动。

Q30和Q20

4. 干净数据(Clean data。数据还有不干净的?):某些实验室根据其自身的判断标准,在PF data的基础上,进一步删除质量不好的reads后得到的数据。常见的删除动作有:

module hutao( input clk , output wire[15:0]out_RBG , output reg out_HSync,//行信号 output reg out_VSync//场信号 ); parameter RBG_white = 16'hFFFF; //白色 wire clk_25MHz ; wire rst_n ; reg [15:0] data_HS; reg [15:0] data_VS; reg [15:0] data_1; reg [15:0] data; always @ (posedge clk_25MHz or negedge rst_n) begin if (~rst_n) data_HS<=16'd0; else if(data_HS==16'd799) data_HS<=16'd0; else data_HS<=data_HS+1'd1; end always @ (posedge clk_25MHz or negedge rst_n) begin if (~rst_n) data_VS<=16'd0; else if(data_HS==16'd799) data_VS<=data_VS+1'd1; else if(data_VS==16'd525) data_VS<=16'd0; else data_VS<=data_VS; end always @ (posedge clk_25MHz or negedge rst_n) begin if (~rst_n) data_1<=16'd0; else if(data_1==16'd10&&data_VS==16'd525) data_1<=16'd0; else if(data_VS==16'd525) data_1<=data_1+1'd1; else data_1<=data_1; end always @ (posedge clk_25MHz or negedge rst_n) begin if (~rst_n) data<=16'd0; else if(data==16'd0&&data_1==16'd10&&data_VS==16'd525) data<=16'd0; else if(data_1==16'd10&&data_VS==16'd525) data<=data+1'd1; else data<=data; end always @ (posedge clk_25MHz or negedge rst_n) begin if (~rst_n) out_HSync<=1'd0; else if(data_HS<16'd96) out_HSync<=1'd1; else out_HSync<=1'd0; end always @ (posedge clk_25MHz or negedge rst_n) begin if (~rst_n) out_VSync<=1'd0; else if(data_VS<16'd2) out_VSync<=1'd1; else out_VSync<=1'd0; end reg [31:0]co_x; reg [31:0]co_y; always @ (posedge clk_25MHz or negedge rst_n) begin if (~rst_n)begin co_x<=1'd0; co_y<=1'd0; end else begin co_x<=data_HS-16'd143; co_y<=data_VS-16'd34; end end wire display; reg rden_sig ; // reg rden_sig1 ; // reg rden_sig2 ; // reg rden_sig3 ; // reg rden_sig4 ; // reg rden_sig5 ; // reg rden_sig6 ; // reg rden_sig7 ; // reg rden_sig8 ; // reg rden_sig9 ; // reg rden_sig10; // reg rden_sig11; // reg rden_sig12; // reg rden_sig13; // reg rden_sig14; // reg rden_sig15; // reg rden_sig16; // reg rden_sig17; // reg rden_sig18; // reg rden_sig19; // reg rden_sig20; // reg rden_sig21; // reg rden_sig22; // reg rden_sig23; // reg rden_sig24; // reg rden_sig25; // reg rden_sig26; // reg rden_sig27; // reg rden_sig28; // reg rden_sig29; // reg rden_sig30; wire [15:0]q1; wire [15:0]q2; wire [15:0]q3; wire [15:0]q4; wire [15:0]q5; wire [15:0]q6; wire [15:0]q7; wire [15:0]q8; wire [15:0]q9; wire [15:0]q10; wire [15:0]q11; wire [15:0]q12; wire [15:0]q13; wire [15:0]q14; wire [15:0]q15; wire [15:0]q16; wire [15:0]q17; wire [15:0]q18; wire [15:0]q19; wire [15:0]q20; wire [15:0]q21; wire [15:0]q22; wire [15:0]q23; wire [15:0]q24; wire [15:0]q25; wire [15:0]q26; wire [15:0]q27; wire [15:0]q28; wire [15:0]q29; wire [15:0]q30; reg [15:0]address_sig; //assign display=((data_HS>=16'd143&&data_HS<16'd783)&&(data_VS>=16'd34&&data_VS<16'd514))?1'd1:1'd0;//显示标志 /* // ====== 修改部分:添加 prev_co_y 检测行变化 ====== reg [31:0] prev_co_y; always @ (posedge clk_25MHz or negedge rst_n) begin if (~rst_n) prev_co_y <= 0; else prev_co_y <= co_y; end // ====== 替换原来的 rden_sig address_sig 逻辑 ====== always @ (posedge clk_25MHz or negedge rst_n) begin if (~rst_n) begin rden_sig <= 1'd0; address_sig <= 16'd0; end else if (display) begin // 检查当前点是否在图像区域内 if (co_x >= 32'd270 && co_x < 32'd293 && co_y >= 32'd290 && co_y < 32'd312) begin // 进入图像区域 rden_sig <= 1'd1; // 如果是本行第一个像素 (x==270),则初始化 base 地址 if (co_x == 32'd270) begin address_sig <= (co_y - 32'd290) * 16'd23; // 起始地址:行号 × 宽度 end else begin address_sig <= address_sig + 1'd1; // 其他像素依次 +1 end end else begin rden_sig <= 1'd0; address_sig <= 16'd0; end end else if (data_VS == 16'd525) begin // 帧结束时复位 rden_sig <= 1'd0; address_sig <= 16'd0; end else begin rden_sig <= 1'd0; address_sig <= address_sig; end end */ // ===== 第一步:添加参数 ===== parameter SCALE = 10; // ===== 第二步:修改 display 判断区域 ===== localparam IMG_LEFT = 270; localparam IMG_TOP = 290; localparam IMG_WIDTH = 23 * SCALE; // 230 localparam IMG_HEIGHT = 22 * SCALE; // 220 assign display = ((data_HS >= IMG_LEFT && data_HS < IMG_LEFT + IMG_WIDTH) && (data_VS >= IMG_TOP && data_VS < IMG_TOP + IMG_HEIGHT)) ? 1'd1 : 1'd0; // ===== 第三步:增加坐标映射 ===== wire [4:0] img_x; wire [4:0] img_y; wire [31:0] offset_x = co_x - IMG_LEFT; wire [31:0] offset_y = co_y - IMG_TOP; assign img_x = offset_x / SCALE; assign img_y = offset_y / SCALE; // ===== 第四步:替换 address_sig rden_sig 逻辑 ===== always @ (posedge clk_25MHz or negedge rst_n) begin if (~rst_n) begin rden_sig <= 1'd0; address_sig <= 16'd0; end else if (display) begin rden_sig <= 1'd1; address_sig <= (img_y * 23) + img_x; // 核心:定位原始像素 end else begin rden_sig <= 1'd0; address_sig <= 16'd0; end end wire [15:0]q; // always @ (posedge clk_25MHz or negedge rst_n) // begin if (~rst_n)begin // rden_sig1 <=1'd0; // rden_sig2 <=1'd0; // rden_sig3 <=1'd0; // rden_sig4 <=1'd0; // rden_sig5 <=1'd0; // rden_sig6 <=1'd0; // rden_sig7 <=1'd0; // rden_sig8 <=1'd0; // rden_sig9 <=1'd0; // rden_sig10<=1'd0; // rden_sig11<=1'd0; // rden_sig12<=1'd0; // rden_sig13<=1'd0; // rden_sig14<=1'd0; // rden_sig15<=1'd0; // rden_sig16<=1'd0; // rden_sig17<=1'd0; // rden_sig18<=1'd0; // rden_sig19<=1'd0; // rden_sig20<=1'd0; // rden_sig21<=1'd0; // rden_sig22<=1'd0; // rden_sig23<=1'd0; // rden_sig24<=1'd0; // rden_sig25<=1'd0; // rden_sig26<=1'd0; // rden_sig27<=1'd0; // rden_sig28<=1'd0; // rden_sig29<=1'd0; // rden_sig30<=1'd0; // end // else // begin // case(data) // 16'd0 :rden_sig1 <=rden_sig; // 16'd1 :rden_sig2 <=rden_sig; // 16'd2 :rden_sig3 <=rden_sig; // 16'd3 :rden_sig4 <=rden_sig; // 16'd4 :rden_sig5 <=rden_sig; // 16'd5 :rden_sig6 <=rden_sig; // 16'd6 :rden_sig7 <=rden_sig; // 16'd7 :rden_sig8 <=rden_sig; // 16'd8 :rden_sig9 <=rden_sig; // 16'd9 :rden_sig10<=rden_sig; // 16'd10 :rden_sig11<=rden_sig; // 16'd11 :rden_sig12<=rden_sig; // 16'd12 :rden_sig13<=rden_sig; // 16'd13 :rden_sig14<=rden_sig; // 16'd14 :rden_sig15<=rden_sig; // 16'd15 :rden_sig16<=rden_sig; // 16'd16 :rden_sig17<=rden_sig; // 16'd17 :rden_sig18<=rden_sig; // 16'd18 :rden_sig19<=rden_sig; // 16'd19 :rden_sig20<=rden_sig; // 16'd20 :rden_sig21<=rden_sig; // 16'd21 :rden_sig22<=rden_sig; // 16'd22 :rden_sig23<=rden_sig; // 16'd23 :rden_sig24<=rden_sig; // 16'd24 :rden_sig25<=rden_sig; // 16'd25 :rden_sig26<=rden_sig; // 16'd26 :rden_sig27<=rden_sig; // 16'd27 :rden_sig28<=rden_sig; // 16'd28 :rden_sig29<=rden_sig; // 16'd29 :rden_sig30<=rden_sig; // endcase // end // end assign out_RBG=(~display)?1'd0: (rden_sig==1'd1)?q:RBG_white; assign q= (data==16'd0 )?q1 : (data==16'd1 )?q2 : (data==16'd2 )?q3 : (data==16'd3 )?q4 : (data==16'd4 )?q5 : (data==16'd5 )?q6 : (data==16'd6 )?q7 : (data==16'd7 )?q8 : (data==16'd8 )?q9 : (data==16'd9 )?q10: (data==16'd10)?q11: (data==16'd11)?q12: (data==16'd12)?q13: (data==16'd13)?q14: (data==16'd14)?q15: (data==16'd15)?q16: (data==16'd16)?q17: (data==16'd17)?q18: (data==16'd18)?q19: (data==16'd19)?q20: (data==16'd20)?q21: (data==16'd21)?q22: (data==16'd22)?q23: (data==16'd23)?q24: (data==16'd24)?q25: (data==16'd25)?q26: (data==16'd26)?q27: (data==16'd27)?q28: (data==16'd28)?q29: (data==16'd29)?q30:white; pll_25MHz pll_25MHz_inst ( .inclk0 ( clk ), .c0 ( clk_25MHz ), .locked ( rst_n ) ); rom1 rom1_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q1) ); rom2 rom2_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q2) ); rom3 rom3_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q3) ); rom4 rom4_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q4) ); rom5 rom5_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q5) ); rom6 rom6_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q6) ); rom7 rom7_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q7) ); rom8 rom8_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q8) ); rom9 rom9_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q9) ); rom10 rom10_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q10) ); rom11 rom11_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q11) ); rom12 rom12_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q12) ); rom13 rom13_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q13) ); rom14 rom14_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q14) ); rom15 rom15_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q15) ); rom16 rom16_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q16) ); rom17 rom17_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q17) ); rom18 rom18_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q18) ); rom19 rom19_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q19) ); rom20 rom20_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q20) ); rom21 rom21_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q21) ); rom22 rom22_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q22) ); rom23 rom23_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q23) ); rom24 rom24_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q24) ); rom25 rom25_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q25) ); rom26 rom26_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q26) ); rom27 rom27_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q27) ); rom28 rom28_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q28) ); rom29 rom29_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q29) ); rom30 rom30_inst ( .address ( address_sig), .clock ( clk ), .rden ( rden_sig), .q ( q30) ); endmodule哈哈哈哈这样可以吗]
最新发布
10-16
<think>我们正在讨论ICM42688传感器其DMP(动态运动处理器)的使用集成问题。首先,ICM42688是一款6轴MEMS运动传感器,结合了3轴陀螺仪3轴加速度计。其内置的DMP可以处理传感器数据,减轻主处理器的负担。关键点:1.DMP可以运行预加载的固件,实现如姿态识别、计步、手势检测等算法。2.使用DMP需要配置传感器寄存器,加载固件,并设置数据输出。步骤:1.初始化传感器,确保传感器处于正常模式。2.配置传感器寄存器,例如设置加速度计陀螺仪的量程输出数据率(ODR)。3.启用DMP,加载固件(通常由厂商提供)。4.配置DMP的输出数据格式速率。5.读取DMP处理后的数据。注意:具体寄存器固件加载步骤需参考ICM42688的官方数据手册应用笔记。下面是一个简化的伪代码示例,展示如何初始化使用DMP:```c//假设我们有一个函数来写入传感器寄存器voidwrite_register(uint8_treg,uint8_tvalue);//初始化传感器voidinit_icm42688(){//重置设备write_register(0x0,0x01);delay(100);//配置加速度计陀螺仪write_register(ACCEL_CONFIG,0x01);//设置加速度计量程为±16gwrite_register(GYRO_CONFIG,0x01);//设置陀螺仪量程为±2000dps//启用DMPwrite_register(DMP_ENABLE,0x01);//加载DMP固件(这里需要根据厂商提供的固件镜像加载步骤进行)load_dmp_firmware();//设置DMP输出数据率write_register(DMP_OUTPUT_RATE,0x0A);//例如100Hz}//读取DMP处理后的数据voidread_dmp_data(){//从FIFO或指定寄存器中读取数据//数据可能包含四元数、欧拉角、计步等,取决于DMP固件配置}```注意:上述代码仅为示意,实际开发需严格遵循数据手册。集成DMP时,需要特别注意:1.固件加载:DMP固件通常以二进制形式提供,需要按照特定顺序写入指定内存区域。2.数据对齐:DMP输出的数据可能需要特殊解析。3.中断配置:可以利用传感器中断来通知数据就绪。更多细节请参考InvenSense的官方文档[^1]。§§相关问题§§1.如何获取ICM42688的DMP固件?2.ICM42688DMP支持哪些运动处理算法?3.如何解析DMP输出的四元数数据?4.在嵌入式系统中集成ICM42688DMP需要注意什么?</think> ### ICM42688 DMP 使用与集成指南 ICM42688 是 TDK InvenSense 推出的高性能 6 轴 MEMS 运动传感器(3轴加速度计 + 3轴陀螺仪),其内置的 **DMP(动态运动处理器)** 能显著降低主处理器负载。以下是关键使用集成要点: --- #### **1. DMP 核心功能** - **运动处理**:实时计算姿态角(俯仰/横滚/偏航) - **传感器融合**:通过卡尔曼滤波融合加速度计/陀螺仪数据 - **低功耗运行**:在传感器内部完成运算,主处理器可休眠 - **预处理功能**: - 计步检测 - 晃动识别 - 跌落检测 - 敲击检测[^1] --- #### **2. DMP 启用步骤** **硬件准备**: ```c // I2C 初始化(示例代码) void i2c_init() { // 配置I2C时钟、引脚等 // ICM42688地址:0x68 (7-bit) } ``` **配置流程**: 1. **复位传感器**: ```c write_reg(REG_DEVICE_CONFIG, 0x01); // 软复位 delay(100); ``` 2. **加载 DMP 固件**: ```c // 需从TDK获取专用固件(FW42688.h) for(int i=0; i<DMP_FW_SIZE; i++) { write_reg(DMP_MEM_START + i, dmp_firmware[i]); } ``` 3. **启用传感器**: ```c write_reg(REG_PWR_MGMT0, 0x0F); // 启用6轴 + 低噪声模式 write_reg(REG_DMP_CONFIG, 0x01); // 激活DMP ``` --- #### **3. 数据获取方式** **FIFO 读取(推荐)**: ```c uint8_t fifo_buffer[128]; read_fifo(fifo_buffer); // 读取FIFO数据 // 解析姿态数据 (q30格式) float pitch = (fifo_buffer[0] << 24 | fifo_buffer[1] << 16) / 1073741824.0f; float roll = (fifo_buffer[2] << 24 | fifo_buffer[3] << 16) / 1073741824.0f; ``` > **注**:数据格式需参考《ICM42688寄存器手册》第5.7节[^1] --- #### **4. 集成注意事项** - **时钟同步**:需配置 `REG_INTF_CONFIG1` 实现传感器与主处理器时钟同步 - **中断配置**:启用 `REG_INT_SOURCE0` 的 `DMP_INT` 位实现事件驱动 - **电源管理**:DMP运行时功耗约 800µA,待机模式可降至 6µA - **校准要求**: - 上电后执行陀螺仪零偏校准 - 加速度计需水平静止校准[^2] --- #### **5. 开发资源** 1. [ICM42688 数据手册](https://invensense.tdk.com/download-pdf/icm-42688-p-datasheet/) 2. [DMP 配置指南](https://invensense.tdk.com/wp-content/uploads/2023/02/AN-000265.pdf) 3. [开源驱动参考](https://github.com/PX4/PX4-Autopilot/tree/master/src/drivers/imu/invensense) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值