精华内容
下载资源
问答
  • 谈CRC循环冗余校验的之前,先把二进制除法说一下,先回忆一下十进制之间的除法是如何运算的, 这个式子在做除法的时候满足了这几个条件: 从被除数的最左边开始向右做除法 被除数运算的两位永远除数大 如果相减...

    谈CRC循环冗余校验的之前,先把二进制除法说一下,先回忆一下十进制之间的除法是如何运算的,

    在这里插入图片描述

    这个式子在做除法的时候满足了这几个条件:

    • 从被除数的最左边开始向右做除法
    • 被除数运算的两位永远比除数大
    • 如果相减的时候需要向前一位借1,则前一位要减1

    知道两个概念

    模2和

    两个二进制位相加不进位,即 0+0=0,0+1=1,1+0=1,1+1=0(此时不进位)

    模2减

    两个二进制位相减不借位,即0-0=0,0-1=1(此时不进位),1-0=1,1-1=0

    两种不同的二进制除法

    除法

    这个方法和正常的十进制除法没什么区别,就和刚开始回顾的二进制除法运算方法一样,在下面的例子中,被除数前四位1010除以111要考虑向前一位借1,其实把这些二进制转换成十进制的除法就是83/7=11…6,而这个二进制的运算结果完全吻合。
    在这里插入图片描述

    模2除法

    模2除法就要用到之前说的两个概念之中的1个,就是模2减,除数和被除数相减的时候不考虑进位(可以看作做异或运算),这就引出了CRC(Cyclic Redundancy Check)循环冗余校验,用来检测或校验数据传输或者保存后可能出现的错误,本次主要讲解在计算机网络信息传输中的校验,计算机组成原理的信息保存校验原理和网络信息校验一样,不做深入讲解。在相减的时候每一次都是3位之间相减。你可能会问,为什么有时结果是1,有时结果是0呢,主要是被除数百位和除数百位相减可以抵消,不然相减结果还是3位就没有意义了。

    在这里插入图片描述

    CRC 循环冗余校验

    编码过程

    计算机传输数据的时候要最底层是物理层,向上有数据链路,网络层等等。当然数据要从计算机输出,是自上向下传输,比如从网络层得到一个IP数据报,封装成数据帧。在发送端把数据划分成组,假设每一组k位,数据M=101001,那么k=6,在M后面添加n位的二进制数值(冗余码)用来差错检验。添加冗余码的时候被除数和除数之间进行的是模2除法

    接下来确定除数,除数采用二进制系数多项式,如下表

    名称 多项式 对应除数
    CRC-8 x8+x2+x+1 1000 0011 1
    CRC-16 x12+x11+x3+x2+x+1 1100 0000 01111

    x8+x2+x+1表示二进制第8,2,1,0位为1,黄色的就是0位,其它多项式同理

    接下来继续M数据的处理,设除数P=1101,则n=3,为什么冗余码的长度是3呢?

    因为余数比除数少1,余数是被用来做校验用的。被除数是2nM=101001000

    为什么后面多出来n个0呢?这和后面的检验有关由于拿到的是(k+n)的数据要对数据做模2运算最后判断余数,只有被除数处于(除数+除数的余数)才会等于0,所以0的个数和余数的个数一样。

    根据上面模2除法运算结果是商为110100,余数为001,把101010改为101001001,这就是一个完整的可校验数据。

    下表是本题的各个数据的含义

    符号 含义
    M 一组数据 101001
    n 冗余码的位数 3
    k 每组数据的位数 6
    P 除数 1101
    2nM 被除数 101001000
    Q 110101
    R (余数)冗余码 001
    2nM+R 发送的数据 101001001

    差错检测能力

    利用多项式,我们定义误码多项式E(X)是接收到的消息码字与正确码字的异或。即

    E(X) = Trecv(X) XOR Tcorrect(X) …… (14)

    当E(X)能够被CRC多项式P(X)整除的时候(即R=0)CRC算法无法检查到错误。当我们选择一个适当的P(X)时,E(X)都不能被P(X)整除,因此可以检测出的出错情况有:

    • 单比特差错,只要P(X)含有一个以上的非零项。
    • 双比特差错,只要P(X)满足上述两种形式((12)(13)式)。
    • 任意奇数个比特差错,只要P(X)含有因式(X - 1)。
    • 任意突发差错,当突发差错长度小于或等于帧检验序列(F(X))的长度(n - k)。
    • 长度为(n - k + 1)的突发差错片段,这个片段等于(1-2-(n-k-1))。
    • 长度大于(n - k + 1)的突发差错片段,这个片段等于(1 - 2-(n-k))。
    展开全文
  • 不得不说,做视频要写文章难太多了!可能是因为视频新手的原因,在做第一个视频的时候,录了3个小时,剪了6个小时,我终于完成了一个10分钟的视频!然而,沉浸在第一支视频的兴奋中没多久,我发现了一个问题。在我...

    前阵子,花了不少时间在做MATLAB视频这件事上。

    不得不说,做视频要比写文章难太多了!

    可能是因为视频新手的原因,在做第一个视频的时候,录了3个小时,剪了6个小时,我终于完成了一个10分钟的视频!

    5077842136473b0c836887bf6c1c9b89.png

    然而,沉浸在第一支视频的兴奋中没多久,我发现了一个问题。

    在我阅片无数之后,我发现自己做的视频居然没有字幕……

    于是,在做第二个视频的时候,除了录视频,剪视频之外,我又多花了两个小时,做了一次汉语听写练习,视频里放一句,我手敲字幕一句。

    这次做视频的经历实在是太折磨了!

    我不相信做字幕会用这么蠢的办法,于是我就上网搜做字幕最快最简单的方法,我很快在B站找到了答案

    71db23e2043695bcadf35a8ae5170f5a.png

    答案跟我说,先把音频转txt文本,然后在arctime软件中手动对每句字幕进行时间轴上的定位。

    了解行业内幕之后的我,迫不及待要开始第三个视频的制作!

    在录完视频、剪完视频之后,又到了制作字幕环节

    网上就有很多在线音频转字幕的网站,我选择了科大讯飞

    fe211b00297ea491729f7bce2619ead5.png

    然而,在音频转写完成后,转写预览里的文字,居然没办法选中复制……

    要导出文档的话,需要付费,每分钟音频0.33元……

    我是一个在乎3毛钱的人吗!

    这不是3不3毛钱的问题!

    对于程序员来说,这是尊严的问题!

    于是,我就用MATLAB写了一款音频转文字的工具。

    59f4aa190ea5f437f80d9b6b5038c6e5.png
    https://www.zhihu.com/video/1181588808822419456

    我可能是B站里为数不多的,没有打光器,没有麦克风,但是居然会先给自己写工具的Up主……

    实现音频转文字之后,我开始用acrtime加时间轴做字幕文件。

    整个制作过程非常梦幻……

    首先要把整个文本进行分行,每一行代表每次要显示的字幕

    于是,还没开始做时间轴,我就要花差不多5分钟时间,见到句号要回车,见到逗号要回车,感觉句子太长要回车,听到语气有转折,还要回车!

    此刻,我非常想念我的解压神器……

    253c0a5a6f9f39afd251f3c06b171472.gif

    文本分段完之后,我就开始体验所谓全网最快最简单的上字幕法。

    在arctime里有一个模式,叫快速拖拽创建工具。

    5f50385b67dc8ebe7eb394829823f608.png

    我一直不太理解这个名字的意思,不过在这个模式下,每听到一句字幕,就要按一下暂停,然后字幕会加到这段时间轴上。

    这难道不是另一种形式的汉语听力练习吗!

    说好的全网最快最简单的上字幕方法呢!

    于是,我就用MATLAB写了一款音频转字幕的工具,在加载处理完音频文件之后,自动生成srt字幕文件。

    f5042412e7b128fd4da75e0e98b8403b.gif

    我可能是B站里为数不多的,没有打光器,没有麦克风,写完一个工具不过瘾又写了一个工具的Up主……

    接下来简单地聊一聊如何用MATLAB实现音频转文字的功能。

    这个功能的实现,是通过调用百度语音识别的API,这类网站还有不少,包括科大讯飞,也有提供API可以调用。

    如果大家有兴趣也想玩一玩这个语音识别的话,需要先登陆百度智能云管理中心,创建一个语音识别的应用。

    135bd1531c8b2baca796fe3a7dd348d4.gif

    应用创建成功之后,会生成属于自己的API Key和Secret Key,之后通过https://openapi.baidu.com/oauth/2.0/token获取token,token的值将会作为之后API调用的其中一项参数传递。

    API调用的另一个非常重要的参数就是音频信号,这里需要base64的格式,这个格式的转换代码,大家也是可以在我之后发布的源代码中看到的。

    还需要注意的一点是,API接受的频率只有16000,这个是在API技术文档中定义好的。所以大家有些录制的音频,如果频率不是16000的话,就需要对频率进行一个转化。

    其他所需的API参数,有兴趣的朋友可以在百度智能云的技术文档里查看,最后需要把这些参数定义为一个struct格式通过webwrite进行传递

    https://cloud.baidu.com/doc/SPEECH/s/rjwvy5jlx/

    关于音频转字幕文件,目前我在这部分使用的策略比较简单。

    在MATLAB读取完音频之后,先进行滤波,之后检测音频中幅值小于阈值并持续0.5秒,则认为处于句子停顿。

    在未识别出停顿的情况下,根据语音识别的文字,进行标点符号的正则法处理,然后在单句音频上进行断句设置时间轴。

    虽然这个策略比较简单,不过实现起来不太容易。

    如果音频时长太长的话,读取到的数据非常大,如果代码里但凡使用一个for循环,整体的计算效率会非常差。

    音频数据处理,是一个非常好的MATLAB练习题,可以强迫自己不使用for循环,这个练习也是知识星球“基础训练营”中的其中一道练习题,非常推荐大家试一试。

    以上就是今天的分享,对源代码感兴趣的朋友,可以在公众号后台回复“语音识别”获取源代码下载链接。

    如果大家有兴趣,欢迎关注我的微信公众号“打浦桥程序员”,谢谢

    展开全文
  • 说起循环神经网络,如果需要自己去实现一个双向RNN/LSTM/GRU模型,那么如何去实现呢? 首先需要熟悉循环神经网络的基本原理。 假如输入的序列是{} (不得不吐槽,csdn公式编辑器有点烂),是1时刻下单词对应的向量...

    说起循环神经网络,如果需要自己去实现一个双向RNN/LSTM/GRU模型,那么如何去实现呢?

    首先需要熟悉循环神经网络的基本原理。

    假如输入的序列是{x_1, x_2, ..., x_t, x_n} (不得不吐槽,csdn公式编辑器有点烂),x_1是1时刻下单词对应的向量,假设是1*128维度的。

    实际上,正向的LSTM,就是从左往右走,计算一遍LSTM,得到{h_1^\rightarrow , h_2^\rightarrow, ..., h_t^\rightarrow, h_n^\rightarrow},这里h_1是1时刻的输出,也是个向量。有些博客和教程用y_1来表示,比容易弄混淆,使用h_1其实更加准确。

    反向的LSTM,则是从右往左走,计算一遍LSTM,先从x_n开始算起,再算x_{n-1},一直算到x_1,然后得到的是反向的输出

    {h_n^\leftarrow , h_t^\leftarrow, ..., h_2^\leftarrow, h_1^\leftarrow}, 然后再把这个向量reverse,翻转一下,把两者连接起来即可。

    PyTorch的实现里有个非常关键的方法:

    其中steps控制了是反向还是正向的计算方法,input则是输出的{x_1, x_2, ..., x_t, x_n}。

    def Recurrent(inner, reverse=False):
    
        def forward(input, hidden, weight, batch_sizes):
    
            output = []
    
            steps = range(input.size(0) - 1, -1, -1) if reverse else range(input.size(0))
    
            for i in steps:
    
                hidden = inner(input[i], hidden, *weight)
    
                # hack to handle LSTM
    
                output.append(hidden[0] if isinstance(hidden, tuple) else hidden)
    
            if reverse:
    
                output.reverse()
    
            output = torch.cat(output, 0).view(input.size(0), *output[0].size())
    
            return hidden, output
    
        return forward

    Keras或者TensorFlow的实现,里面有个叫参数叫做go_backwards, 实际上也是创建了两个LSTM,一个正向传递,一个反向传递,实现方法大同小异。

    因为TensorFlow的RNN里有个go_backwards参数,如果设置为True,则就会从后往前遍历。

    keras实现方法关键性如下:

    可见是创建了两个layer,每个layer都是一个RNN.

    self.forward_layer = copy.copy(layer)
    
    config = layer.get_config()
    
    config['go_backwards'] = not config['go_backwards']
    
    self.backward_layer = layer.__class__.from_config(config)

     

    展开全文
  • (注意:考虑到每次迭代的计算比这个函数本身“更昂贵”,这就足够了.这可以真正改进,但“它有效”.)每次返回返回的函数时,此函数都会返回一个命名列表(带有提供的因子).它是懒惰的,因为它没有扩展整个可...

    一种(可以说是更“正确”)的方法是为@BenBolker建议的迭代器编写自己的迭代器(写入扩展的pdf是

    here).缺乏更正式的东西,这里是一个穷人的迭代器,类似于expand.grid但是手动推进. (注意:考虑到每次迭代的计算比这个函数本身“更昂贵”,这就足够了.这可以真正改进,但“它有效”.)

    每次返回返回的函数时,此函数都会返回一个命名列表(带有提供的因子).它是懒惰的,因为它没有扩展整个可能的列表;它本身并不是懒惰,它们应该立即“消耗”.

    lazyExpandGrid

    dots

    sizes

    indices

    function() {

    indices[1] <

    DONE

    while (any(rolls sizes))) {

    if (tail(rolls, n=1)) return(FALSE)

    indices[rolls] <

    indices[ 1+which(rolls) ] <

    }

    mapply(`[`, dots, indices, SIMPLIFY = FALSE)

    }

    }

    样品用法:

    nxt

    nxt()

    # a b c

    # 1 1 15 21

    nxt()

    # a b c

    # 1 2 15 21

    nxt()

    # a b c

    # 1 3 15 21

    nxt()

    # a b c

    # 1 1 16 21

    ##

    nxt()

    # a b c

    # 1 3 16 22

    nxt()

    # [1] FALSE

    注意:为了简洁显示,我使用as.data.frame(mapply(…))作为示例;它可以正常工作,但如果命名列表适合您,则无需转换为data.frame.

    编辑

    基于alexis_laz’s answer,这是一个大大改进的版本,它(a)更快,(b)允许任意搜索.

    lazyExpandGrid

    dots

    argnames

    if (is.null(argnames)) argnames

    sizes

    indices

    maxcount

    i

    function(index) {

    i <

    if (length(i) > 1L) return(do.call(rbind.data.frame, lapply(i, sys.function(0))))

    if (i > maxcount || i < 1L) return(FALSE)

    setNames(Map(`[[`, dots, (i - 1L) %% indices[-1L] %/% indices[-length(indices)] + 1L ),

    argnames)

    }

    }

    它不使用任何参数(自动递增内部计数器),一个参数(搜索和设置内部计数器)或向量参数(寻找每个参数并将计数器设置为最后一个,返回data.frame).

    最后一个用例允许对设计空间的子集进行采样:

    set.seed(42)

    nxt

    as.data.frame(nxt())

    # a b c d e f

    # 1 1 1 1 1 1 1

    nxt(sample(1e2^6, size=7))

    # a b c d e f

    # 2 69 61 7 7 49 92

    # 21 72 28 55 40 62 29

    # 3 88 32 53 46 18 65

    # 4 88 33 31 89 66 74

    # 5 57 75 31 93 70 66

    # 6 100 86 79 42 78 46

    # 7 55 41 25 73 47 94

    感谢alexis_laz对cumprod,Map和索引计算的改进!

    展开全文
  • 其次:当 Vue 处理指令时,v-for v-if 具有更高的优先级将 users替换为一个计算属性 (比如 activeUsers),让其返回过滤后的列表将: <ul> <li v-for="user in users" v-if="user.isActive" :key=...
  • 本文旨在解释“循环生成网络”的内部工作原理,以及如何将其应用于解决现实世界中的任务。介绍 循环生成对抗网络(简称CycleGans)[1]是功能强大的计算机算法,具有改善数字生态系统的潜力。 它们能够将信息从一种...
  • 循环生成网络 CycleGan 原理介绍

    千次阅读 2020-06-15 09:56:27
    ​ 本文旨在解释“循环生成网络”的内部工作原理,以及如何将其应用于解决现实世界中的任务。 介绍 ​ 循环生成对抗网络(简称CycleGans)[1]是功能强大的计算机算法,具有改善数字生态系统的潜力。 它们能够将...
  • 前面几篇文章笔者介绍了如何使pandas计算得到大幅提升,其中包括pandas快速处理字符串方法和使用map、apply和applymap函数批量处理数据,并且普通循环操作处理数据快500多倍,本文将再次谈及为pandas计算加速,...
  • 曾经我们以为,无论计算机有多么强大,都不足以预测未来。...这种反馈循环会滋生混乱,即使是初始条件下的微小变化也会导致后来的行为产生巨大变化,从而使预测几乎不可能成功,无论计算机的算力如何。 马里.
  • 2、$row[’id’] 的速度是$row[id]的7倍。 3、echo print快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串... 4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用fore...
  • 例如for循环的不同写法就会对编译器优化这段代码产生不同的效率,当程序中包含大量这种可优化的代码的时候,运算性能就会出现问题。想要知道如何优化代码的运算性能就需要知道代码在硬件层的执行差异。 1.低效率函数...
  • 如何提升php运行速度

    2018-03-20 19:54:02
    1、 如果能将类的方法定义成 static,就尽量定义成 static,它的速度会ᨀ升将近 4 倍。2、 $row[’id’] 的速度是$row[id]的 7 ...4、在执行 for 循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用fore...
  • 下面提供一个如何使用clock函数的模板 最终得到的结果是以秒为单位的duration 下面以一个实例演示一下两种写法分别跑的速度 结果显示如下: (结果不正确,全是0,原因是这两个函数跑的都太快了,运行时间都不到...
  • 计算循环队列的元素个数:“尾指针减头指针”,若为负数,再加其容量即可。 1.5 链表 在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。其中...
  • 如何提高php性能1

    2016-07-28 08:52:08
    1、 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。  2、$row[’id’] 的速度是$row[id]的7倍。...4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreac
  • 如何让PHP运行更高效

    2017-11-08 21:39:00
    1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。2、$row['id'] 的速度是$row[id]的7倍。...4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好...
  • 1、 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。2、$row[’id’] 的速度是$row...4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。5、注...
  • 1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。 2、$row['id']的速度是$row...4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。 5、注...
  • 3. 设计、实现、测试和调试一个使用下面每一种基本程序设计结构的程序:基本计算、简单的输入/输出、标准的条件和循环结构以及函数定义。 4.对于指定的程序设计任务,选择适当的条件和循环结构。 5.运用结构化(功能...
  • 对子网掩码使用需要更多的主机位,可以得到更多的子网,节约了IP地址资源,若将来需要更多子网时,不用再重新分配IP地址,但每个子网的主机数量有限;反之,子网掩码使用较少的主机位,每个子网的主机数量允许有更...
  • 取一个正整数的后继 这个操作也是定义整个自然数集的基本思想: 然而这个方式用来即使用来计算相当小的自然数也是相当冗长的: 如果将后继的个数当作一个参数,那么就能够得到一个后继更加强大的使数字...
  • 由于进一步释放了计算并行能力,这几行简单的代码运算速度也会传统多维循环快很多。 这种数学计算的包已经成为数据科学、图形学以及机器学习领域的标准。同时它的影响力还在不断的扩大到其他领域。 在 Python 的...
  • 9.1.2 如何进行比较 9.2 排序网络 9.2.1 双调排序 9.2.2 将双调排序映射到超立方体和格网 9.3 冒泡排序及其变体 9.3.1 奇偶转换 9.3.2 希尔排序 9.4 快速排序 9.4.1 并行快速排序 9.4.2 用于CRCWPRAM的...
  • 1、如果能将类的方法定义成static,就... 4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。 5、注销那些不用的变量尤其是大数组,以便释放内存。 6、尽量避免使用__get,_...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 193
精华内容 77
关键字:

循环比如何计算