Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >留存专题-1~180日留存数仓设计

留存专题-1~180日留存数仓设计

作者头像
数据仓库晨曦
发布于 2024-12-19 07:46:07
发布于 2024-12-19 07:46:07
16310
代码可运行
举报
文章被收录于专栏:数据仓库技术数据仓库技术
运行总次数:0
代码可运行

计算1~180天留存率数据仓库设计方案。在实际业务场景中可能是计算 1、3、7、14、30、60、90、180日留存这种方式,也可能是1~180连续每天都要计算,当然极端情况下也会有1~360日留存的计算。主要讲述建设思路。文章以1~7日数据进行计算了展示,计算180日留存时需要调整数据周期。

一、数据处理

把生成的数据作为ods层数据,进行基础的数据清洗和加工。

新增用户表: 加工为用户维表或者是用户快照表。在实际业务场景中,通常建设为用户快照表,每天一份全量快照。

用户登录表: 在实际应用场景中,原始数据为用户的所有登录日志(或者是所有操作日志记录)。在dwd层,按照用户登录日期分区,包含用户当天的全量操作记录。在dws层按天进行分区,按照用户进行去重处理,每个活跃用户每天一条记录。(实际应用中一定要处理,减少计算留存数据的复杂度和计算量。给出的样例数据没有重复记录,不需要dwd层明细数据存储了,所以直接给出dws层的按日分区的表。

表结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--新增用户表
create table t_dim_user_create
(
    user_id      string,
    create_date  string
) COMMENT '新增用户表'
partitioned by (dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
-- 用户登录表
create table t_dws_user_login
(
    user_id     string
) COMMENT '用户登录表'
partitioned by (login_date string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

ETL流程

我们给出的数据无需太多处理,主要将原始数据进行分区。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--新增用户表数据插入(这里创建628日分区数据,628日是我们创建的用户的最后一天)
insert overwrite table t_dim_user_create partition(dt = '2024-06-28')
select user_id,create_date
from t_user_create
where create_date <= '2024-06-28';

--用户登录表
insert overwrite table t_dws_user_login partition(login_date)
select user_id,login_date
from t_user_login;

样例数据-用户登录表的分区数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show partitions t_dws_user_login;
+------------------------+
|       partition        |
+------------------------+
| login_date=2024-01-01  |
| login_date=2024-01-02  |
| login_date=2024-01-03  |
| login_date=2024-01-04  |
| login_date=2024-01-05  |
| login_date=2024-01-06  |
| login_date=2024-01-07  |
| login_date=2024-01-08  |
| login_date=2024-01-09  |
| login_date=2024-01-10  |
……

以上就是基础数据的处理,着重将数据进行了分区处理,使其更加符合实际场景中的分区。

方案一:横表处理-直接计算

直接进行计算,产出对应的留存率数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select create_date,
       sum(r1) / count(distinct user_id) as r1_rate,
       sum(r2) / count(distinct user_id) as r2_rate,
       sum(r3) / count(distinct user_id) as r3_rate,
       sum(r4) / count(distinct user_id) as r4_rate,
       sum(r5) / count(distinct user_id) as r5_rate,
       sum(r6) / count(distinct user_id) as r6_rate,
       sum(r7) / count(distinct user_id) as r7_rate
from (select t_create.user_id,
             t_create.create_date,
             t_login.login_date,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 1 then 1 else 0 end as r1,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 2 then 1 else 0 end as r2,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 3 then 1 else 0 end as r3,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 4 then 1 else 0 end as r4,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 5 then 1 else 0 end as r5,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 6 then 1 else 0 end as r6,
             case when datediff(to_date(t_login.login_date), to_date(t_create.create_date)) = 7 then 1 else 0 end as r7
      from (select user_id,
                   create_date
            from t_dim_user_create
            where dt = '2024-06-28'
              and create_date < '2024-06-28'
              and create_date >= date_add('2024-06-28', -7)) t_create
               left join
           (select user_id,
                   login_date
            from t_dws_user_login) t_login
           on t_create.user_id = t_login.user_id
      where to_date(t_login.login_date) > to_date(t_create.create_date)
        and t_login.login_date > date_add('2024-06-28', -7)
        and t_login.login_date <= '2024-06-28') tt
group by create_date
order by create_date asc

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------------+----------+----------+----------+----------+----------+----------+----------+
| create_date  | r1_rate  | r2_rate  | r3_rate  | r4_rate  | r5_rate  | r6_rate  | r7_rate  |
+--------------+----------+----------+----------+----------+----------+----------+----------+
| 2024-06-21   | 1.0      | 1.0      | 0.8      | 0.8      | 1.0      | 0.8      | 0.6      |
| 2024-06-22   | 0.8      | 1.0      | 0.8      | 0.9      | 0.9      | 0.9      | 0.0      |
| 2024-06-23   | 1.0      | 0.9      | 0.9      | 0.7      | 1.0      | 0.0      | 0.0      |
| 2024-06-24   | 1.0      | 1.0      | 0.9      | 0.7      | 0.0      | 0.0      | 0.0      |
| 2024-06-25   | 1.0      | 0.9      | 0.9      | 0.0      | 0.0      | 0.0      | 0.0      |
| 2024-06-26   | 0.9      | 0.7      | 0.0      | 0.0      | 0.0      | 0.0      | 0.0      |
| 2024-06-27   | 1.0      | 0.0      | 0.0      | 0.0      | 0.0      | 0.0      | 0.0      |
+--------------+----------+----------+----------+----------+----------+----------+----------+

方案二:先竖表再横表-根据创建日期分区

先以竖表的方式建设DM层,其中DM层以create_date作为分区字段 建表语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table t_dm_user_retention1
(
    retention_days   bigint COMMENT '留存天数',
    retention_rate   double COMMENT '留存率'
) COMMENT '用户留存率1'
partitioned by (create_date string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

数据插入语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert overwrite table t_dm_user_retention1 partition (create_date)
select retention_days,
             login_cnt / create_date_cnt as retention_reate,
             create_date
      from (select t_create.create_date,
                   create_date_cnt,
                   datediff(to_date(t_login.login_date), to_date(t_create.create_date)) as retention_days,
                   count(1)                                                             as login_cnt
            from (select user_id,
                         create_date,
                         count(user_id) over (partition by create_date) as create_date_cnt
                  from t_dim_user_create
                  where dt= '2024-06-28' --限定数据分区
                  and create_date >= date_add('2024-06-28',-7)
                  and create_date <= '2024-06-28' --进行数据行裁剪
                      ) t_create
                     left join
                 (select user_id,
                         login_date
                  from t_dws_user_login
                  where login_date > date_add('2024-06-28',-7)
                  and login_date <= '2024-06-28' --重点关注该部分使用的数据分区数量
                  ) t_login
                 on t_create.user_id = t_login.user_id
            where to_date(t_login.login_date) > to_date(t_create.create_date)
            group by t_create.create_date, create_date_cnt, retention_days) t

样例数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from t_dm_user_retention1 where create_date = '2024-06-21' order by retention_days asc;
+-----------------+-----------------+--------------+
| retention_days  | retention_rate  | create_date  |
+-----------------+-----------------+--------------+
| 1               | 1.0             | 2024-06-21   |
| 2               | 1.0             | 2024-06-21   |
| 3               | 0.8             | 2024-06-21   |
| 4               | 0.8             | 2024-06-21   |
| 5               | 1.0             | 2024-06-21   |
| 6               | 0.8             | 2024-06-21   |
| 7               | 0.6             | 2024-06-21   |
+-----------------+-----------------+--------------+

查询最后留存数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select *
from t_dm_user_retention1 pivot (
        sum(retention_rate) as rate
        for retention_days in(1 as 1_day,2 as 2_day,3 as 3_day,4 as 4_day,5 as 5_day,6 as 6_day,7 as 7_day)
        )
where create_date >= '2024-06-21'
order by 1 asc

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------------+--------+--------+--------+--------+--------+--------+--------+
| create_date  | 1_day  | 2_day  | 3_day  | 4_day  | 5_day  | 6_day  | 7_day  |
+--------------+--------+--------+--------+--------+--------+--------+--------+
| 2024-06-21   | 1.0    | 1.0    | 0.8    | 0.8    | 1.0    | 0.8    | 0.6    |
| 2024-06-22   | 0.8    | 1.0    | 0.8    | 0.9    | 0.9    | 0.9    | NULL   |
| 2024-06-23   | 1.0    | 0.9    | 0.9    | 0.7    | 1.0    | NULL   | NULL   |
| 2024-06-24   | 1.0    | 1.0    | 0.9    | 0.7    | NULL   | NULL   | NULL   |
| 2024-06-25   | 1.0    | 0.9    | 0.9    | NULL   | NULL   | NULL   | NULL   |
| 2024-06-26   | 0.9    | 0.7    | NULL   | NULL   | NULL   | NULL   | NULL   |
| 2024-06-27   | 1.0    | NULL   | NULL   | NULL   | NULL   | NULL   | NULL   |
+--------------+--------+--------+--------+--------+--------+--------+--------+

方案三:先竖表再横表,以登陆日期作为竖表分区结果

根据登陆日期作为分区,字段包含新增日期、留存天数、留存率和用户登陆日期。 建表语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table t_dm_user_retention2
(
    create_date      string COMMENT '新增日期',
    retention_days   bigint COMMENT '留存天数',
    retention_rate   double COMMENT '留存率'
) COMMENT '用户留存率2'
partitioned by (login_date string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

数据插入语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--2024-06-28日数据处理
insert overwrite table t_dm_user_retention2 partition (login_date)
select create_date,
       retention_days,
       login_cnt / create_date_cnt as retention_reate,
       login_date
from (select t_create.create_date,
             t_login.login_date,
             create_date_cnt,
             datediff(to_date(t_login.login_date), to_date(t_create.create_date)) as retention_days,
             count(1)                                                             as login_cnt
      from (select user_id,
                   create_date,
                   count(user_id) over (partition by create_date) as create_date_cnt
            from t_dim_user_create
            where dt = '2024-06-28' --限定数据分区
              and create_date >= date_add('2024-06-28', -7)
              and create_date <= '2024-06-28' --进行数据行裁剪
           ) t_create
               left join
           (select user_id,
                   login_date
            from t_dws_user_login
            where login_date = '2024-06-28' --重点关注该部分使用的数据分区数量
           ) t_login
           on t_create.user_id = t_login.user_id
      where to_date(t_login.login_date) > to_date(t_create.create_date)
      group by t_create.create_date, t_login.login_date, create_date_cnt, retention_days) t

为了能有2024-06-21日之后的所有留存数据,需要对前面7天的数据进行刷新。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--2024-06-27日数据处理
insert overwrite table t_dm_user_retention2 partition (login_date)
select create_date,
       retention_days,
       login_cnt / create_date_cnt as retention_reate,
       login_date
from (select t_create.create_date,
             t_login.login_date,
             create_date_cnt,
             datediff(to_date(t_login.login_date), to_date(t_create.create_date)) as retention_days,
             count(1)                                                             as login_cnt
      from (select user_id,
                   create_date,
                   count(user_id) over (partition by create_date) as create_date_cnt
            from t_dim_user_create
            where dt = '2024-06-27' --限定数据分区
              and create_date >= date_add('2024-06-27', -7)
              and create_date <= '2024-06-27' --进行数据行裁剪
           ) t_create
               left join
           (select user_id,
                   login_date
            from t_dws_user_login
            where login_date = '2024-06-27' --重点关注该部分使用的数据分区数量
           ) t_login
           on t_create.user_id = t_login.user_id
      where to_date(t_login.login_date) > to_date(t_create.create_date)
      group by t_create.create_date, t_login.login_date, create_date_cnt, retention_days) t

样例数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------------+-----------------+-----------------+-------------+
| create_date  | retention_days  | retention_rate  | login_date  |
+--------------+-----------------+-----------------+-------------+
| 2024-06-14   | 7               | 0.7             | 2024-06-21  |
| 2024-06-15   | 6               | 0.8             | 2024-06-21  |
| 2024-06-16   | 5               | 0.5             | 2024-06-21  |
| 2024-06-17   | 4               | 0.9             | 2024-06-21  |
| 2024-06-18   | 3               | 0.8             | 2024-06-21  |
| 2024-06-19   | 2               | 0.9             | 2024-06-21  |
| 2024-06-20   | 1               | 0.8             | 2024-06-21  |
| 2024-06-15   | 7               | 0.8             | 2024-06-22  |
| 2024-06-16   | 6               | 0.6             | 2024-06-22  |
| 2024-06-17   | 5               | 1.0             | 2024-06-22  |
| 2024-06-18   | 4               | 0.8             | 2024-06-22  |
| 2024-06-19   | 3               | 1.0             | 2024-06-22  |
| 2024-06-20   | 2               | 1.0             | 2024-06-22  |
| 2024-06-21   | 1               | 1.0             | 2024-06-22  |
| 2024-06-16   | 7               | 0.8             | 2024-06-23  |
| 2024-06-17   | 6               | 0.8             | 2024-06-23  |
| 2024-06-18   | 5               | 0.9             | 2024-06-23  |
| 2024-06-19   | 4               | 1.0             | 2024-06-23  |
| 2024-06-20   | 3               | 0.7             | 2024-06-23  |
| 2024-06-21   | 2               | 1.0             | 2024-06-23  |
| 2024-06-22   | 1               | 0.8             | 2024-06-23  |
| 2024-06-17   | 7               | 0.8             | 2024-06-24  |
| 2024-06-18   | 6               | 0.9             | 2024-06-24  |
| 2024-06-19   | 5               | 1.0             | 2024-06-24  |
| 2024-06-20   | 4               | 0.7             | 2024-06-24  |
| 2024-06-21   | 3               | 0.8             | 2024-06-24  |
| 2024-06-22   | 2               | 1.0             | 2024-06-24  |
| 2024-06-23   | 1               | 1.0             | 2024-06-24  |
| 2024-06-18   | 7               | 0.7             | 2024-06-25  |
| 2024-06-19   | 6               | 0.7             | 2024-06-25  |
| 2024-06-20   | 5               | 0.5             | 2024-06-25  |
| 2024-06-21   | 4               | 0.8             | 2024-06-25  |
| 2024-06-22   | 3               | 0.8             | 2024-06-25  |
| 2024-06-23   | 2               | 0.9             | 2024-06-25  |
| 2024-06-24   | 1               | 1.0             | 2024-06-25  |
| 2024-06-19   | 7               | 0.9             | 2024-06-26  |
| 2024-06-20   | 6               | 0.6             | 2024-06-26  |
| 2024-06-21   | 5               | 1.0             | 2024-06-26  |
| 2024-06-22   | 4               | 0.9             | 2024-06-26  |
| 2024-06-23   | 3               | 0.9             | 2024-06-26  |
| 2024-06-24   | 2               | 1.0             | 2024-06-26  |
| 2024-06-25   | 1               | 1.0             | 2024-06-26  |
| 2024-06-20   | 7               | 0.8             | 2024-06-27  |
| 2024-06-21   | 6               | 0.8             | 2024-06-27  |
| 2024-06-22   | 5               | 0.9             | 2024-06-27  |
| 2024-06-23   | 4               | 0.7             | 2024-06-27  |
| 2024-06-24   | 3               | 0.9             | 2024-06-27  |
| 2024-06-25   | 2               | 0.9             | 2024-06-27  |
| 2024-06-26   | 1               | 0.9             | 2024-06-27  |
| 2024-06-21   | 7               | 0.6             | 2024-06-28  |
| 2024-06-22   | 6               | 0.9             | 2024-06-28  |
| 2024-06-23   | 5               | 1.0             | 2024-06-28  |
| 2024-06-24   | 4               | 0.7             | 2024-06-28  |
| 2024-06-25   | 3               | 0.9             | 2024-06-28  |
| 2024-06-26   | 2               | 0.7             | 2024-06-28  |
| 2024-06-27   | 1               | 1.0             | 2024-06-28  |
+--------------+-----------------+-----------------+-------------+

查询结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select *
from (select create_date, retention_days, retention_rate
      from t_dm_user_retention2
      where login_date > '2024-06-21'
        and create_date >= '2024-06-21') t pivot (
        sum(retention_rate) as rate
        for retention_days in(1 as 1_day,2 as 2_day,3 as 3_day,4 as 4_day,5 as 5_day,6 as 6_day,7 as 7_day)
        )

order by 1 asc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------------+--------+--------+--------+--------+--------+--------+--------+
| create_date  | 1_day  | 2_day  | 3_day  | 4_day  | 5_day  | 6_day  | 7_day  |
+--------------+--------+--------+--------+--------+--------+--------+--------+
| 2024-06-21   | 1.0    | 1.0    | 0.8    | 0.8    | 1.0    | 0.8    | 0.6    |
| 2024-06-22   | 0.8    | 1.0    | 0.8    | 0.9    | 0.9    | 0.9    | NULL   |
| 2024-06-23   | 1.0    | 0.9    | 0.9    | 0.7    | 1.0    | NULL   | NULL   |
| 2024-06-24   | 1.0    | 1.0    | 0.9    | 0.7    | NULL   | NULL   | NULL   |
| 2024-06-25   | 1.0    | 0.9    | 0.9    | NULL   | NULL   | NULL   | NULL   |
| 2024-06-26   | 0.9    | 0.7    | NULL   | NULL   | NULL   | NULL   | NULL   |
| 2024-06-27   | 1.0    | NULL   | NULL   | NULL   | NULL   | NULL   | NULL   |
+--------------+--------+--------+--------+--------+--------+--------+--------+

方案对比

我们需要思考和对比集中方式在日常每天调度中的计算量对应程序的复杂度。

  • 1.写SQL或者说SQL可读性上讲,方案一和方案二、方案三并无太大差别。方案一更加直接,但是需要写较多的重复逻辑,较多的case when 。竖表则更加简洁,但是需要进一步行转列,尤其明确需要横表展示的情况下。
  • 2.方案一和方案二每天调度计算最新日期的留存时,所需要的登陆日志数据均为留存周期内的所有日志数据。即1~7日留存则需要7天的登陆日志,1~180天留存则需要180天的登陆日志。方案三则仅需要1天的登陆日志。(注意:这里是整个方案的核心,节约计算量关键所在)
  • 3.查询数据的时候,方案二对比方案三相对简单,方案三需要先限定数据分区,然后在查询分区内的创建日期,逻辑相对较绕一些,对外交付使用时沟通成本变高,建议转换为横表之后交付。
  • 总结:在数据量较大、并且需要计算较长留存周期,建议使用方案三,对下游交付行转列之后的横表结果,便于与下游沟通。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
大佬也是地物的吗😄
大佬也是地物的吗😄
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
地震信号-相关子波零相位化
子波的振幅不变,改变相位谱的滤波器,以达到子波形状改变的过程称为子波整形或整形滤波
用户3412318
2018/12/26
1.1K0
地震信号的一些基本概念
可控震源是指通过一个与大地紧密耦合的振动平板,以反作用方式向地下传送一组连续振动的弹性波信号(又称扫描信号),再经过对地面接收到的反射波信号的处理和辨识,用于解释地下地质目标的构造形态与产状。这种扫描信号是一种连续的、频率变化的信号。不是所有的连续信号都可以用于地震勘探,除伪随机信号外,可控震源的扫描信号必须满足如下基本要求:
用户3412318
2018/12/24
1.2K0
吴大正信号与系统-频域分析总结
吴大正的书现在来看是真不错,奥本海姆让我迷失在了知识的海洋。反而现在看这种国内教科书的感觉非常好。
云深无际
2024/10/11
2540
吴大正信号与系统-频域分析总结
语音信号处理习题
大家好,又见面了,我是你们的朋友全栈君。 二、问答题(每题 5 分,共 20 分) 1、语音信号处理主要研究哪几方面的内容? 语音信号处理是研究用数字信号处理技术对语言信号进行处理的一门学科, 语音信号处理的理论和研究包括紧密结合的两个方面: 一方面, 从语言的产生和感知来对其进行研究, 这一研究与语言、语言学、认知科学、心理、生理等学科密不可分;另一方面,是将语音作为一种信号来进行处理, 包括传统的数字信号处理技术以及一些新的应用于语音信号的处理方法和技术。 2、语音识别的研究目标和计算机自动
全栈程序员站长
2022/08/27
8050
基于线性预测的语音编码原理解析
早期的音频系统都是基于声音的模拟信号实现的,在声音的录制、编辑和播放过程中很容易引入各种噪声,从而导致信号的失真。随着信息技术的发展,数字信号处理技术在越来越多领域得到了应用,数字信号更是具备了易于存储和远距离传输、没有累积失真、抗干扰能力强等等,信号和信号处理都往数字化发展。为了使得数字音频可以被高效地压缩存储并高品质地还原,数字音频的编码技术就变成至关重要的一个部分了。本篇文章会介绍当今的音频的编码器(传统算法非深度学习)的两大主流阵营之一的基于线性预测的语音编码器的原理。
LiveVideoStack
2021/09/23
1.1K0
基于线性预测的语音编码原理解析
《信号与系统》很难?也许你应该看看这篇文章
小枣君:大家都知道《信号与系统》是一门很难的课。今天给大家推荐一篇文章,看了之后,也许就会找到打开这门课的正确方式。
鲜枣课堂
2019/07/22
2.1K0
数字信号处理——绪论总结
随着信息学科的快速发展,以及大规模集成电路、超大规模集成电路和软件开发引起的计算机学科的飞速发展,自1965年快速傅里叶变换算法提出后,数字信号处理( digital signal processing,DSP)迅速发展成为一门新兴的独立的学科体系,这一学科已经应用于几乎所有工程、科学、技术领域,并渗透到人们日常生活和工作的方方面面。简言之,数字信号处理是把信号用数字或符号表示的序列,通过计算机或通用(专用)信号处理设备,用数字的数值计算方法对信号作各种所需的处理,以达到提取有用信息、便于应用的目的。
叶庭云
2020/09/17
2.3K0
数字信号处理——绪论总结
信号处理(四)
任何一个函数都可以由一系列正弦波的叠加表示,比如盒子函数对应的傅立叶函数形式如下:
一只小虾米
2022/10/25
5740
信号处理(四)
信号处理中包络是什么意思_重庆邮电大学复试通信原理
数字信号是信号参量的取值是离散的,模拟信号是信号参量的取值是连续的。区别是信号参量的取值是连续还是离散。
全栈程序员站长
2022/09/22
2.3K0
卷积神经网络中的傅里叶变换:1024x1024 的傅里叶卷积
卷积神经网络 (CNN) 得到了广泛的应用并且事实证明他是非常成功的。但是卷积的计算很低效,滑动窗口需要很多计算并且限制了过滤器的大小,通常在 [3,3] 到 [7,7] 之间的小核限制了感受野(最近才出现的大核卷积可以参考我们以前的文章),并且需要许多层来捕获输入张量的全局上下文(例如 2D 图像)。图像越大小核的的表现就越差。这就是为什么很难找到处理输入高分辨率图像的 CNN模型。
deephub
2022/11/11
1.5K0
卷积神经网络中的傅里叶变换:1024x1024 的傅里叶卷积
数字信号处理matlab实验心得,数字信号处理学习心得体会3篇
《数字信号处理》是我们通信工程和电子类专业的一门重要的专业基础课程,主要任务是研究数字信号处理理论的基本概念和基本分析方法,通过建立数学模型和适当的数学分析处理,来展示这些理论和方法的实际应用。数字信号处理技术正飞速发展,它不但自成一门学科,更是以不同形式影响和渗透到其他学科。以下是小编为大家精心准备的:,欢迎参考阅读!
全栈程序员站长
2022/08/01
2.1K0
BCI脑电信号分析
BCI(脑机接口)作为一个人脑与计算机之间的交流系统。它允许其用户控制外部设备独立于周围神经和肌肉大脑活动。BCI系统允许主体发送通过使用大脑信号向外部设备发出命令。脑机接口渠道可以被认为是唯一的途径受运动障碍影响的人可以交流他们的想法。对帮助患者非常有帮助运动功能受损,例如完全瘫痪肌萎缩侧索硬化症患者。目的BCI是将大脑活动解释为数字形式充当计算机的命令。一项关键挑战目前的BCI研究是如何提取随机特征随时间变化的脑电信号并将信号分类为尽可能准确。这种方法的成功取决于处理大脑的方法的选择每个阶段的信号。
脑机接口社区
2022/09/22
1.4K0
BCI脑电信号分析
Computer Graphics note(3):视口变换&光栅化
Games101 Lecture5-6-7 在M(模型)V(视图)P(投影)变换之后,得到[−1,1]3[-1,1]^3[−1,1]3,接下来就是将其映射到屏幕空间上去。 M变换:https://blog.csdn.net/Enterprise_/article/details/106880754 VP变换:https://blog.csdn.net/Enterprise_/article/details/106934622
Enterprise_
2020/08/02
1.2K0
MATLAB语音信号处理「建议收藏」
数字信号处理课设,我们使用MATLAB对语音信号进行了一系列处理,并将其所有功能集中于下图界面中:
全栈程序员站长
2022/09/01
4.2K0
MATLAB语音信号处理「建议收藏」
数字信号处理课程实验报告(数字信号处理需要什么基础)
按照题目要求,首先应利用计算机生成一个由多个频率叠加而成的信号。之后在不通风抽样频率之下对信号进行采样。编写FFT程序对信号进行DFT变换,应能观察出在满足和不满足奈奎斯特采样定理的情况下信号频谱分别处于不混叠和混叠状态。然后需要对信号进行恢复以观察满足或不满足奈奎斯特采样定理的情况下,频域的频谱混叠对时域恢复信号的影响。在频谱混叠时,观察其时域信号的失真。
全栈程序员站长
2022/07/30
8800
数字信号处理课程实验报告(数字信号处理需要什么基础)
大话信号与系统 — 奇文共欣赏[通俗易懂]
前言:大家都知道《信号与系统》是一门很难的课,很多人虽然学过了,但其实什么也没得到,今天给大家推荐这篇文章,看了之后,相信你会有收获。
全栈程序员站长
2022/09/22
1K0
雷达系统导论_雷达信号处理基础第二版
其中,幅度调制A(t)仅仅表示脉冲的包络。接收机处理的主要功能是将雷达信号中承载信息的部分变换到基带,目的是测量
全栈程序员站长
2022/11/01
7720
雷达系统导论_雷达信号处理基础第二版
Computer Graphics note(3):视图变换 & 光栅化
M变换:https://blog.csdn.net/Enterprise_/article/details/106880754 VP变换:https://blog.csdn.net/Enterprise_/article/details/106934622
Enterprise_
2020/06/29
9570
Computer Graphics note(3):视图变换 & 光栅化
Mel频谱和MFCC深入浅出
在音频领域,mel频谱和mfcc是非常重要的特征数据,在深度学习领域通常用此特征数据作为网络的输入训练模型,来解决音频领域的各种分类、分离等业务,如端点侦测、节奏识别、和弦识别、音高追踪、乐器分类、音源分离、回声消除等相关业务。
用户10366352
2023/02/28
2.4K0
Mel频谱和MFCC深入浅出
音频知识(二)--MFCCs
音频项目中,比如识别,重建或者生成任务之前通常都需要将音频从时域转换到频域,提取特征后再进行后续工作。MFCC(Mel-Frequency Cepstral Coefficients),梅尔倒谱系数,就是比较常用的音频特征提取方式。本文主要介绍mfcc提取流程。
languageX
2021/05/10
4.5K0
音频知识(二)--MFCCs
推荐阅读
相关推荐
地震信号-相关子波零相位化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验