精华内容
下载资源
问答
  • 借什么什么形
    千次阅读
    2020-08-21 10:13:32

    郭化若将军注解《孙子兵法》,认为:形,是运动的物质;势,是物质的运动。

    我认为这个注解是非常精确的,而且是非常本质的。

    运动,无所不在;那么,势,也是无所不在。有物质就有运动,就有势。

    一、造势和借势的定义

    所谓造势,是某人或物主动地运动,以造成一种有利于实现目标的状态。

    而借势,是某人(或物)借助他人(或物)的运动状态,来改变自己的运动状态,以更好更容易的实现目标。

    二、造势

    在篮球比赛中,形,就是五个球员,势,就是五个球员之间的运动配合。

    球员在比赛中,或带球突破,或无球跑位,或传球,或阻挡,或拦截,或换防,等等,这些运动都是在造势,造成空位(空出一个进攻球员来)的势。

    这空出来的球员拿到球,射篮得分,他就是最后克敌制胜的奇兵,是给予敌人致命一击的杀手。

    在没有空位的情况下,攻防一对一,攻方会做一些假动作,欺骗守方球员,制造无干扰或少干扰的投篮机会。

    比如,攻方假装投篮,诱骗守方跳起,趁这一瞬间攻方运球过人,趁守方没反应过来时,无干扰投篮——这也相当于空位。

    在篮球比赛中,投篮得分是终极目标,而实现这个终极目标最佳的方式是,制造空位,即其中一个攻方球员完全不被防守,攻方能在完全无干扰的情况下投篮。

    当然,在比赛中,这种理想的空位很难实现,所以攻方要尽量减少守方的干扰。

    怎么减少呢?答案是:造势,造成“空位”的势。

    在一对一的情况下,攻方先做一些假动作,诱骗守方露出破绽,然后趁虚而入,在无干扰或少干扰的情况下投篮——这是自己造空位。

    球员配合的情况下,攻方无球队员可以通过卡位阻挡守方,以帮助带球队员能在无干扰或少干扰的情况下投篮——这是两人配合造空位。

    等等,团队配合制造空位的战术方法有很多,不一一举例。

    一个球队,不懂造势,不能很好的制造空位,投篮的命中率就会非常低,它就赢不了比赛。

    三、借势

    从北京到上海,一个人徒步,可能需要一两个月;而坐车,也就一天时间——坐高铁更快。

    君子生非异也,善假于物,相对于徒步,坐车就是借势——借车的速度。

    营销上有个“借势营销”的说法,很多人把它理解为凑热点。当然,凑热点,也是一种,但并非是借势营销的全部,更不是精髓所在。

    热点,是很多人在某个时间段内集中关注的事情。猎奇心理,会让人们无比渴望了解到事情的发展进程,于是会有很多人主动搜索跟热点相关的各种新闻消息,而营销者此时制作出半真半假掺杂私货的文章,也会得到不少的访问量、阅读量。

    但这些阅读,是否能让消费者记住你的广告,要看你自己的技术水平了。

    归根结底,借势是一种“造主势+借外势”的组合,先要自己主动造一个小的势,以便借助外物的更大势能。

    比如,坐车从北京到上海,你得先主动买票——造主势;然后坐上车,随着车子日行千里——借外势。

    再如,借热点制作软文,你的先主动了解热点,找到与自己产品的契合点,写出文章来——造主势;发布文章,诱导吃瓜群众点击转发——借外势。

    这些借势是最基本的,最简单的,也是最表面化的。

    更深层的借势,一般人理解不了,也很难看到。

    比如,借国家政策的势,有人开公司去拿政府补贴,这就不是一般人能看到的——就算一般人看到了,也未必有能力去开类似的公司,造主势。

    你看不到这个势,就不可能借;你无法掌握这个外势的运动规律,同样也不能借;即便掌握了规律,你没有能力去造主势,也同样借不了。

    所以,借势的前提有三个:发现外势,认识外势,能造主势。

    原始人穿越到现在,根本意识不到坐车去上海更快,他就不会去选择坐车;如果他不知道汽车站或火车站是什么东西,面对南来北往的车辆,他同样犯迷糊;即便他认识到坐车更快,要去汽车站或火车站坐车,但他没钱买票,也同样坐不了车。

    我们可能会嘲笑原始人不会坐车,但在纷乱复杂的现实面前,我们并不比原始人高明到哪去。

    想要认清势的规律,借势成事,还得多下功夫。

    更多相关内容
  • 行业分类-设备装置-用于圆形图书自动还设备的旋转装置.zip
  • 大班艺术:小组合作画《借形想象画》.docx
  • 幼儿园大班优秀美术教案《借形想象》润新教育.txt
  • 三角形的两条内(外)角平分线夹角的模型解决问题-8页.pdf
  • 一个女生编写的简单论坛程序,树目录,实现了论坛相关功能,得你看看!
  • 向右三角形特殊符号

    千次阅读 2020-12-20 01:08:45
    1word文档中怎么插入心形特殊符号?向右三角形特殊符号: word文档中怎么插入心形特殊符号?,缺失:向右三角形特殊...下面我们一起来看看word中心的详细的插入方法,需要的朋友可以参考下。授权:免费版软件大小:2G...

    1word文档中怎么插入心形特殊符号?

    向右三角形特殊符号: word文档中怎么插入心形特殊符号?,缺失:向右三角形特殊符号12628/11

    以下是的一些我们精选的word文档中怎么插入心形特殊符号?

    word文档中怎么插入心形特殊符号?在写情书的是偶想在文档中用心形来表达爱意,但是找不到心形,该怎么办呢?下面我们一起来看看word中心形的详细的插入方法,需要的朋友可以参考下。授权:免费版软件大小:2GB语言:简体中文

    word2016是微软最新发布的文档处理软件,它讲和Office 2016一起发售,新版的word2016在UI设计上更加美观简介、模板获取更加方便,更支持多种方式存档文档。

    爱心符号怎么打

    1、打开Word文档,这里主要是方便复制心形符号 如图

    2、在文档的菜单栏里点击“插入” 如图

    3、然后点击“符号” 如图

    4、在打开的符号设置窗口里,点击“符号” 如图

    5、在字体那里选择“Webdings” 如图

    6、然后找到 心形图标 ,点击“插入” 关掉设置窗口 如图

    7、完成以上操作之后,我们就可以看到文档里有我们刚才插入的心形图标了 ,这时候我们就可以复制粘贴到你想要的地方了 如图

    注意事项:以上是Word2003版本的解决步骤,其他版本或许会有些许不同,这个大家需要注意下。

    最新word文档中怎么插入心形特殊符号?可以看看这篇名叫在word文档中插入特殊符号定义快捷键教程的文章,可能你会获得更多word文档中怎么插入心形特殊符号?

    特殊符号 — 在word文档中插入特殊符号定义快捷键教程

    通过“符号”对话框向word2003文档中插入特殊符号是常规方法,如果需要频繁地插入这些特殊符号时使用这种方法就比较麻烦了。

    其实还有一种更快捷的方法:使用快捷键。在“符号”对话框中可以看到Word2003为常用的符号定义的快捷键。如图一、图二。

    图一 “符号”对话框“符号”选项卡

    图二 “符号”对话框“特殊字符”选项卡

    如果觉得word2003定义的快捷键使用不方便,也可以自己为字符定义快捷键。操作步骤如下:

    1、在“符号”对话框选择要为其定义快捷键的符号。

    2、点击“快捷键”按钮,打开“自定义键盘”对话框,如图三。

    图三 “自定义键盘”对话框

    3、将光标定位于“请按新快捷键”文本框中,按新的快捷键,该快捷键会显示在该文本框中。

    4、点击“指定”按钮,然后点击“关闭”按钮就完成了快捷键的设定。

    5、如果要删除关于这个快捷键的定义,可以在“自定义键盘”对话框中选取“当前快捷键”列表框中的快捷键定义,然后点击“删除”按钮,在点击“关闭”按钮即可。

    2心形特殊符号图案大全

    向右三角形特殊符号: 心形特殊符号图案大全,缺失:向右三角形4009/9

    █████████████████

    ██▓▓▓▓▓▓▓▓██▓█▓▓▓▓▓▓██

    ██▓▓▓▓▓▓▓▓▓▓▓███▓▓▓▓▓▓▓█

    ██▓▓▓▓▓▓▓▓▓▓▓▓▓█▓▓▓▓▓▓▓▓▓▓▓▓█

    █▓▓▓▓▓▓▓▓▓▓▓▓▓▓██▓██▓▓▓▓▓▓▓▓▓▓▓█

    █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█

    █▓▓▓▓▓▓▓▓▓▓▓▓▓▓███▓▓▓▓▓▓▓▓▓▓██

    █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▓▓▓▓▓▓▓▓▓▓▓█

    █▓▓▓▓▓▓▓▓▓▓▓▓▓▓██▓▓▓▓▓▓▓▓▓▓▓█

    █▓▓▓▓▓▓▓▓▓▓▓▓▓████▓▓▓▓▓▓▓▓▓▓▓█

    █▓▓▓▓▓▓▓▓▓▓▓▓▓█▓▓▓▓▓▓▓▓▓▓▓██

    █▓▓▓▓▓▓▓▓▓▓▓▓▓████▓▓▓▓▓▓▓▓▓▓▓█

    █▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█

    █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█

    ██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▓▓▓▓▓▓▓▓▓█

    █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▓▓▓▓▓▓▓▓▓▓█

    █▓▓▓▓▓▓▓▓▓█▓▓▓▓▓███▓▓▓▓▓▓▓▓▓▓▓█▓

    █▓▓▓▓▓▓▓▓▓████████▓▓▓▓▓▓▓▓▓▓██

    ▓█▓▓▓▓▓▓▓▓██▓▓▓▓▓▓▓▓▓▓▓██

    █▓▓▓▓▓▓▓▓██▓▓▓▓▓▓▓▓▓██

    ██▓▓▓▓▓▓▓▓██▓▓▓▓▓▓▓▓▓▓██

    ██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██

    █▓▓▓▓▓▓███▓▓▓▓▓▓▓█

    ██▓▓▓▓▓▓▓▓▓▓▓▓██

    ██▓▓▓▓▓▓▓▓▓█

    ██▓▓▓▓▓██

    █▓▓██

    ▓█

    3教你用输入法打出任意特殊符号

    向右三角形特殊符号: 教你用输入法打出任意特殊符号,缺失:向右三角形3248/9

    最近老有人问我这个符号怎么打,那个符号怎么打。

    我每次回答的都是,你要打的是特殊符号,这种特殊符号不能用输入法打出来,需要借助一些工具才能带出来。

    今天借着比较的充裕,教大家能够用输入法快速打出任何特殊符号的方法吧。本方法仅限电脑操作,手机暂未测试,有兴趣的自己下去测试。

    好了,开始进入正题。

    这里就拿本站的符号为例子好了。

    操作方法:

    1、使用搜狗输入法,点击搜狗工具箱,如图:

    2、在新出来的窗口中,点击添加。如图:

    3、在弹窗来的窗口中搜索“自定义”,然后点击添加,按照如图提示操作:

    4、添加了之后,点击打开。勾选开启输入法自带短语-点击添加新定义-填写信息 。具体操作如图所示:

    5、按照上图箭头正确操作完成之后,你使用搜狗输入法 ,输入 hg ,就可以看到刚才你编辑的特殊符号了。如图:

    6、按照刚才的操作,再把每个符号单独添加上去,效果如图:

    好啦!如果你是认真看完上面的介绍步骤,那么你肯定也学会了。如果你是认真看了,但是还是不会,那么可以联系符号先生寻求帮助。如果你没有认真看就跑来联系符号先生,瞎问一通,那么你可以进入符号先生的黑名单中了,以后永远都不需要联系。

    觉得这个方法很实用很牛逼的,请到符号先生空间去点个赞,我需要看到大家的热情。

    4时空猎人特殊符号的打法

    向右三角形特殊符号: 时空猎人特殊符号的打法,缺失:向右三角形符号3292/9

    各位《时空猎人》的玩家朋友们,大家好!欢迎大家访问新浪时空猎人专区,哪里都可以聊天,游戏中也有聊天系统,分为团队聊天和世界聊天,当然你也可以去私聊,哈哈!今天小摩尔要为大家带来一篇:《时空猎人》世界聊天特殊符号怎么打攻略,在本篇攻略中,小摩尔会介绍金币啊!魔晶,竟点,绑金,福利卷,灯笼,鞭炮,钥匙,单挑和推塔以及蓝钻和黄钻的特殊符号。希望本篇攻略对大家有所帮助!

    金币:##7999

    魔精:##7998

    竟点:##7997

    绑金:##7996

    福利卷:##7994

    灯笼:##7701

    鞭炮:##7702

    钥匙:##7840

    单挑:##7841

    推塔:##7842

    蓝钻0级:##7802

    蓝钻1级:##7821

    蓝钻2级:##7822

    蓝钻3级:##7823

    蓝钻4级:##7824

    蓝钻5级:##7825

    蓝钻6级:##7826

    黄钻0级:##7803

    黄钻1级:##7831

    黄钻2级:##7832

    黄钻3级:##7833

    黄钻4级:##7834

    黄钻5级:##7835

    黄钻6级:##7836

    黄钻7级:##7837

    黄钻8级:##7838

    以上关于时空猎人特殊符号打法就给各位玩家介绍到这里了,感谢大家的学习!特此敬上!祝您嗨天!

    展开全文
  • 单纯法实现

    2020-02-03 16:22:51
    之前一直使用Gurobi对各种整数规划以及线性规划模型进行求解,单纯法一直未曾实现,春节休息时间进行完成。 首先弥补单纯法的理论基础。此前学习过程中经常是使用的时候再去回顾一下,机理并未参透,今日看到...

    联系我:ligong15 AT foxmail.com

    2020年春节期间疫情期间完成此部分内容学习回顾

    之前一直使用Gurobi对各种整数规划以及线性规划模型进行求解,单纯形法一直未曾实现,借春节休息时间进行完成。

    首先弥补单纯形法的理论基础。此前学习过程中经常是使用的时候再去回顾一下,机理并未参透,今日看到了单纯形法直观解释(记为博客1)与单纯形法理论解释(记为博客2)。

    通过两篇文章,对单纯形法进行了实施,值得注意的是,实现过程中,变动的为基可行解,那么基可行解对应的B以及其逆矩阵可以通过numpy很简单的求解出来,检验数也可以通过下式很方便的求得。

    入基所需步骤:此时xb,xn确定。1、获取B,获取B的逆矩阵;2、通过下式获取检验数构成的向量;3、根据目标函数max或是min,选取向量中对应的换入变量。若是求min,则是向量中小于零的最小值,即,选此变量,能使目标函数进一步减小;若是求max,则是向量中大于零的最大值,即,选此变量,能使目标函数进一步增大。

    f=c^{T}x=c_{B}^{T}x_{B}+c_{N}^{T}x_{N}=c_{B}^{T}\left ( B^{-1}b-B^{-1}Nx_{N}\right )+c_{N}^{T}x_{N}

    =c_{B}^{T} B^{-1}b+\left ( c_{N}^{T}- c_{B}^{T}B^{-1}N\right )x_{N}

    出基所需步骤:出基则是在确定换入变量的基础上,选取合适的基变量,将其替换为入基所获取的换入变量。类比次梯度法,入基相当于确定方向,出基相当于确定步长。此部分摘录博客1中相应内内容:

    在求换出变量的过程中,需要计算\theta值,\theta值的求解为单纯形表中b^{_{i}}/a_{ij},当前单纯形表为B^{^{-1}}A,当前等式右端bB^{^{-1}}b,那么\theta值计算所需元素均已获取,可以进行\theta值的计算。

    对以上进行归纳,每次迭代过程中,不对单纯形表进行完全的计算与存储。:

    1、直接已知数据:x_{}Bx_{N}Acb

    2、间接已知数据:BB^{^{-1}}c_{B}^{T}c_{N}^{T}NB^{^{-1}}AB^{^{-1}}b

    3、计算数据:检验数,\theta

     

    代码详见我的GitHub

    展开全文
  • FFT之蝶运算

    千次阅读 2020-12-30 16:05:27
    写这篇博客时,是今天考完电信传输理论后的5个小时,没带计算器,没找别人,一个人抗下了所有。 用C语言实现FFT之时域抽取法的想法是在考数字信号处理前萌发的,在复习时看到书上有编程思想,然后自己又好久都没有...

    Author🚹:CofCai

    Email✉️:cai.dongjun@nexuslink.cn

    QQ😙:1664866311

    CSDN Page🏠

    前言

    写这篇博客时,是今天考完电信传输理论后的5个小时,没带计算器。

    用C语言实现FFT之时域抽取法的想法是在考数字信号处理前萌发的,在复习时看到书上有编程思想,然后自己又好久都没有敲代码了,手有点痒,然后就按照书上的编程思想进行coding。但是之间有许多错误,哎!用C语言这么久了,还是没有养成编写代码时注意数组越界的习惯。

    昨天下午考了数字信号处理,很意外,考点不对,有些考纲上没写,比如考纲上网络结构只写了直接型、级联型以及并联型,没有提到频率采样、线性相位,但是它!它!它!考了,而且考的好偏。另外,我在很久之前就在写数字信号处理的文章/博客,感觉对考试没有帮助,我考前对窗函数设计FIR滤波器很熟悉,感觉很稳,结构它考了频率采样法。

    考完了数字信号处理的晚上,继续完成考前未完成的FFT算法,然后经过慢慢思考,发现书上也有错误,关于最内层循环的迭代方式不对,经过理解,然后修改,得出了正确结果(和MATLAB对比,当然我是用的在线octave进行计算的,我电脑打开MTALAB慢)。

    今天,此时此刻以及前一个小时,手又有点痒了,于是打开FFT代码,继续修改,优化(其实也没怎么优化),完成了从文件中读取数据,将FFT的结果写入到文件中。

    遂作感想如上,记录于此

    下面继续写blog,总结。

    相关文件

    fft.c
    fft_rawdata.txt
    fft_cookeddata.txt
    

    从fft_rawdata.txt中读取要进行fft的数据,数据格式为:

    1. 第一行一个数字,表示数据点数/长度;
    2. 此后每行有两个数字,表示实部和虚部,用Table分割;

    如下:

    在这里插入图片描述

    fft的结果会保存到fft_cookeddata.txt中去,如下:

    在这里插入图片描述

    在代码中我还计算了每个fft结果的幅度和相位,但是没有保存到文件中去,而是打印到标准输出,结果如下(结果中我是以%.1f输出的,所以只显示一位小数):

    在这里插入图片描述

    实操

    准备工作

    对于复数,直接用一个结构体即可,两个成员,分别表示实部和虚部,后面又定义了一个结构体,其实是一样的,只不过成员名称不一样了,用幅度和角度来表示一个复数。

    typedef struct {
    	float real;
    	float imag;
    }complex_t;
    
    // 另外一种复数的表达,幅度加角度/相位
    typedef struct {
    	float amp;
    	float pha;
    }complex_ap_t;
    
    

    时域抽取法/蝶形运算的编程思想参考了数字信号处理书上的第四章。

    旋转因子的表示:

    刚开始不知道 W N p W_N^p WNp怎么表示,后面一想,它不就是一个复数嘛,用欧拉公式展开就可以得到实部和虚部。
    W N p = e − j 2 π N p = cos ⁡ ( 2 π p / N ) − j sin ⁡ ( 2 π p / N ) W_N^p = e^{-j\frac{2\pi}{N}p} = \cos(2{\pi}p/N)-j\sin(2{\pi}p/N) WNp=ejN2πp=cos(2πp/N)jsin(2πp/N)
    因为旋转因子用的比较多,比较频繁,所以没有写成函数,而是用了一个宏定义,如下:

    #define pi 	(3.1415926535)
    // 旋转因子,{}语句块,其结果为最后一条语句的值
    #define	WNP(N,P)	({			\
    	complex_t temp;				\
    	temp.real = cos(2*pi*P/N);	\
    	temp.imag = -sin(2*pi*P/N);	\
    	temp; })
    

    然后还需要实现复数的基本四则运算,加、减、乘,除(代码中没有实现),还有求一个复数的幅度和相位。

    倒序算法

    另外,蝶形运算的初始输入的数据需要倒叙,所以需要写一个函数进行输入数据的倒叙,倒序的算法为:对原始数据的序号的二进制进行反转,得到的结果就是其倒叙后的位置(假设总共有N个数据,那么只看 l o g 2 N log_2^N log2N个二进制位)。

    比如总共有8个数据,那么就值用看3个二进制位,第3个原始数据,经过倒叙后是第6个数据(从0开始,有第0个数据)。

    3 = 011
    
    6 = 110
    

    而C语言不能实现数据的二进制位倒相,所以又要写一个函数(此函数来源于网络)。

    //采用移位的方法使一个数的二进制位翻转后返回
    unsigned int reverse_bit(unsigned int num, const unsigned int N)
    {
    	unsigned int ret = 0;
    	int bit = 0;
    	int i = 0;
    	// log(8.0)/log(2.0) = 3.000,but (unsigned int)x = 2,why?
    	unsigned int M = (unsigned int)(log(N+0.00001)/log(2.0));
    	for (i = 0; i < M; i++)
    	{
    		ret <<= 1;
    		bit = num & 1;
    		ret = bit | ret;
    		num = num / 2;
    	}
    	return ret;
    }
    

    数据的倒序:

    /**
     * 进行FFT前对数据进行倒叙以方便时域抽取法
     * @Author   CofCai
     * @DateTime 2020-12-27T20:48:41+0800
     * @param    c_arr                    数据指针
     * @param    N                        数据长度
     * @return                            成功:1、失败:0
     */
    int reverse_order(complex_t* c_arr, const unsigned int N)
    {
    	complex_t c_temp;
    	/** calloc: initial by zeros  */
    	char* bitmap = calloc(N, sizeof(char));
    	unsigned int i, j;
    	for (i = 0; i < N; ++i) {
    		if (bitmap[i] == 0) {
    			// 先保存第i个数据
    			c_temp.real = c_arr[i].real;
    			c_temp.imag = c_arr[i].imag;
    			// 计算i对应的倒叙,和这个倒叙位置交换数据
    			j = reverse_bit(i, N);
    			c_arr[i].real = c_arr[j].real;
    			c_arr[i].imag = c_arr[j].imag;
    			c_arr[j].real = c_temp.real;
    			c_arr[j].imag = c_temp.imag;
    			// 防止后面j又和i进行倒叙交换
    			*(bitmap+i) = 1;
    			*(bitmap+j) = 1;
    		} else {
    			continue;
    		}
    	}
    	return 1;
    }
    

    编程思想

    蝶形运算要点:
    在第L级中:

    1. 每个蝶形的输入数据相隔 B = 2 L − 1 B=2^{L-1} B=2L1个点;

    2. 每级有B个不同的旋转因子;

    3. 相同旋转因子对应的每个蝶形的输出数据相隔 D = 2 L D=2^L D=2L个点;

    4. 同一旋转因子对应着间隔为 D = 2 L D=2^L D=2L点的 2 M − L 2^{M-L} 2ML个蝶形;(此点包含了第3点,但多一个信息)。

    也就是说:

    1. 第一层循环控制级数,共 M = l o g N M=logN M=logN级,从 L = 1 , . . . , M L=1,...,M L=1,...,M

    2. 第二层循环控制每层的旋转因子,每层有 B = 2 L − 1 B=2^{L-1} B=2L1个不同的旋转因子;

    3. 第三层循环控制每个旋转因子对应的蝶形运算。

      1. 每个旋转因子会被使用 2 M − L 2^{M-L} 2ML次;

      2. 每个蝶形运算的两个输入数据相隔 B = 2 L − 1 B=2^{L-1} B=2L1个点,输出也是相隔B个点(蝶形:交叉平行);

      3. 而同一旋转因子对应的两个相邻的蝶形运算相隔 D = 2 L D=2^L D=2L个点;

    代码实现

    /**
     * author:		CofCai
     * datatime:	2020-12-27 21:00:24
     * file description:
     *	 根据数据信号处理书上第4四章FFT提到的时域抽取法编程思想,
     *	 用C语言实现DIT-FFT算法。
     *	 编写过程中遇到问题了:
     *	 	旋转因子该怎么表示?
     *	 	突然又解决了,用旋转因子不就是复数蛮,一样可以用复数表示
     *	 	W_N^k = e^{-j2pik/N} = cos(2pik/N) - j*sin(2pik/N)
     *
     * 	 似乎结果有问题
     * 	 考完了数字信号处理(老师给的考点一点也不靠谱,好多不会,awsl)
     * 	 继续敲代码,做事情前先弄懂原理,刚开始跟着书上的抄,结果不对,
     * 	 后面自己认真看书,理解蝶形运算的过程,然后发现第三层循环,也就
     * 	 是最内循环的迭代方式不对,不应该是++,而应该按照D=2^L的方式迭代
     * 	 
     * 	 蝶形运算要点:
     *	 	在第L级中:
     * 			1. 每个蝶形的输入数据相隔B=2^{L-1}个点;
     * 			2. 每级有B个不同的旋转因子;
     * 			3. 相同旋转因子对应的每个蝶形的输出数据相隔D=2^L个点;
     * 		 	4. 同一旋转因子对应着间隔为D=2^L点的2^{M-L}个蝶形;(此点包含了第3点,但多一个信息)。
     * 		也就是说:
     * 			1. 第一层循环控制级数,共M=logN级,从L=1,...,M;
     * 			2. 第二层循环控制每层的旋转因子,每层有B=2^{L-1}个不同的旋转因子;
     * 			3. 第三层循环控制每个旋转因子对应的蝶形运算
     * 				1. 每个旋转因子会被使用2^{M-L}次;
     * 				2. 每个蝶形运算的两个输入数据相隔B=2^{L-1}个点,输出也是相隔B个点(蝶形:交叉平行);
     * 				3. 而同一旋转因子对应的两个相邻的蝶形运算相隔D=2^L个点;
     *
     *
     * 	该文件的使用:
     * 		fft_rawdata.txt:此文件用于输入原始数据,
     * 						 第一行是数据个数N,此后每一行表示一个数据,分为实部和虚部,
     * 						 中间以table分割,以换行结束,如:
     * 						 3
     * 						 1.2\t2.3\n
     * 						 2.3\t78.2\n
     * 						 7.2\t12.3\n
     * 		fft_cookeddata.txt:此文件用于保存结果
     * 	
     * 	另外需要注意:
     * 		传入fft的是数据指针,因此是在原数据上直接保存结果,所以如果还需要用到原数据,那么请copy一份。
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    typedef struct {
    	float real;
    	float imag;
    }complex_t;
    
    // 另外一种复数的表达,幅度加角度/相位
    typedef struct {
    	float amp;
    	float pha;
    }complex_ap_t;
    
    
    #define DBG_INFO 0
    #if DBG_INFO
      	#define DBG_PRINTF(fmt, args...)  \
    	do\
    	{\
    	    printf(fmt, ##args);\
    	}while(0)
    #else
      #define DBG_PRINTF(fmt, args...)   
    #endif
    
    #define pi 	(3.1415926535)
    // 旋转因子,{}语句块,其结果为最后一条语句的值
    #define	WNP(N,P)	({			\
    	complex_t temp;				\
    	temp.real = cos(2*pi*P/N);	\
    	temp.imag = -sin(2*pi*P/N);	\
    	temp; })
    
    #define R2C(R)		({			\
    	complex_t c;				\
    	c.real = R;					\
    	c.imag = 0;					\
    	c; })
    
    float cplx_amp(complex_t* c)
    {
    	return sqrt(pow(c->real, 2) + pow(c->imag, 2));
    }
    
    float cplx_angle(complex_t* c)
    {
    	return atan2(c->imag, c->real);
    }
    
    complex_ap_t cplx_amp_angle(complex_t* c)
    {
    	complex_ap_t c_ap;
    	c_ap.amp = cplx_amp(c);
    	c_ap.pha = cplx_angle(c);
    
    	return c_ap;
    }
    
    // 为了减小开销,还是传入指针吧
    complex_t cplx_add(complex_t* c1, complex_t* c2)
    {
    	complex_t temp;
    	temp.real = c1->real + c2->real;
    	temp.imag = c1->imag + c2->imag;
    	return temp;
    }
    
    complex_t cplx_sub(complex_t* c1, complex_t* c2)
    {
    	complex_t temp;
    	temp.real = c1->real - c2->real;
    	temp.imag = c1->imag - c2->imag;
    	return temp;
    }
    
    complex_t cplx_prod(complex_t* c1, complex_t* c2)
    {
    	complex_t temp;
    	// (a1+b1j)(a2+b2j) = (a1a2-b1b2) + (a1b2 + b1a2)
    	temp.real = (c1->real * c2->real) - (c1->imag * c2->imag);
    	temp.imag = (c1->real * c2->imag) + (c1->imag * c2->real);
    	return temp;
    }
    
    //采用移位的方法使一个数的二进制位翻转后返回
    unsigned int reverse_bit(unsigned int num, const unsigned int N)
    {
    	unsigned int ret = 0;
    	int bit = 0;
    	int i = 0;
    	// log(8.0)/log(2.0) = 3.000,but (unsigned int)x = 2,why?
    	unsigned int M = (unsigned int)(log(N+0.00001)/log(2.0));
    	for (i = 0; i < M; i++)
    	{
    		ret <<= 1;
    		bit = num & 1;
    		ret = bit | ret;
    		num = num / 2;
    	}
    	return ret;
    }
    
    /**
     * 进行FFT前对数据进行倒叙以方便时域抽取法
     * @Author   CofCai
     * @DateTime 2020-12-27T20:48:41+0800
     * @param    c_arr                    数据指针
     * @param    N                        数据长度
     * @return                            成功:1、失败:0
     */
    int reverse_order(complex_t* c_arr, const unsigned int N)
    {
    	complex_t c_temp;
    	/** calloc: initial by zeros  */
    	char* bitmap = calloc(N, sizeof(char));
    	unsigned int i, j;
    	for (i = 0; i < N; ++i) {
    		if (bitmap[i] == 0) {
    			// 先保存第i个数据
    			c_temp.real = c_arr[i].real;
    			c_temp.imag = c_arr[i].imag;
    			// 计算i对应的倒叙,和这个倒叙位置交换数据
    			j = reverse_bit(i, N);
    			c_arr[i].real = c_arr[j].real;
    			c_arr[i].imag = c_arr[j].imag;
    			c_arr[j].real = c_temp.real;
    			c_arr[j].imag = c_temp.imag;
    			// 防止后面j又和i进行倒叙交换
    			*(bitmap+i) = 1;
    			*(bitmap+j) = 1;
    		} else {
    			continue;
    		}
    	}
    	return 1;
    }
    
    /**
     * FFT算法
     * 在第L级中:
     * 			1. 每个蝶形的输入数据相隔B=2^{L-1}个点;
     * 			2. 每级有B个不同的旋转因子;
     * 			3. 相同旋转因子对应的每个蝶形的输出数据相隔D=2^L个点;
     * 		 	4. 同一旋转因子对应着间隔为D=2^L点的2^{M-L}个蝶形;(此点包含了第3点,但多一个信息)。
     * @Author   CofCai
     * @DateTime 2020-12-28T21:20:27+0800
     * @param    c_arr                    输入序列,为指针
     * @param    N                        序列长度
     * @return                            无
     */
    int fft(complex_t* c_arr, const unsigned int N)
    {
    	//log_a^b = log_c^b / log_c^a:换底公式
    	unsigned int M = (unsigned int)(log((float)N+0.00001)/log(2.0));
    	DBG_PRINTF("FFT related parameter:");
    	DBG_PRINTF("N = %u\tM = %d\n", N, M);
    	// L:层数,最大为M
    	unsigned int L, k;
    	// 蝶形运算中输入的两个数据相距B个点,J用于索引不同的旋转因子
    	unsigned int J, B, p;
    	// 相同旋转因子的输出结果之间的间隔为:D=2^L
    	unsigned int D;
    	complex_t c_temp, T, WNp;
    	// 倒叙
    	reverse_order(c_arr, N);
    	// 蝶形运算
    	// 第L层
    	for (L = 1; L <= M; ++L) {
    		B = (unsigned int)pow(2, L-1);
    		DBG_PRINTF("第 L = %d层\tB = %d个不同的旋转因子\n", L, B);
    		// 第L层有B = 2^(L-1)个旋转因子,每个为W_{2^L}^J,J=0,1,...,B-1。
    		// 经过变换,可得旋转因子为:W_N^p,p=Jx2^{M-L}。
    		for (J = 0; J <= B-1; ++J) {
    			// 第L层第J个旋转因子的指数
    			p = (unsigned int)(pow(2, M-L)*J);
    			DBG_PRINTF("J = %d对应的旋转因子的指数为P = %d\n", J, p);
    			// 前面说过每层共有2^(L-1)个旋转因子,而每个旋转因子在此层会被利用2^{M-L}次
    			WNp = WNP(N, p);
    			DBG_PRINTF("旋转因子WNp: (%u, %u)-->(%1.f + %1.fj)\n", N, p, WNp.real, WNp.imag);
    			// D是同一旋转因子对应的蝶形的输出结果之间的距离,而B是输入碟形数据之间的距离
    			D = (unsigned int)pow(2, L);
    			// 下面的循环就是计算出WNp对应的蝶形运算的结果
    			for (k = J; k <= N-1; k+=D) {
    				// A_{L}(J) = A_{L-1}(J) + A_{L-1}(J+B)W_N^p;
    				// A_{L}(J+B) = A_{L-1}(J) - A_{L-1}(J+B)W_N^p;
    				
    				c_temp = cplx_prod(c_arr+k+B, &WNp);
    				// DBG_PRINTF("prod:(%1.f+%1.fj) * (%1.f+%1.fj)=(%1.f+%1.fj)\n", 
    				// 	(c_arr+k+B)->real, (c_arr+k+B)->imag, WNp.real, WNp.imag, c_temp.real, c_temp.imag);
    				
    				T = cplx_add(c_arr+k, &c_temp);
    				DBG_PRINTF("AL(%u) = A(%u) + A(%u)WNp\n", k, k, k+B);
    				// DBG_PRINTF("add:(%1.f+%1.fj) + (%1.f+%1.fj)=(%1.f+%1.fj)\n",
    				// 	(c_arr+k)->real, (c_arr+k)->imag, c_temp.real, c_temp.imag, T.real, T.imag);
    				
    				*(c_arr+k+B) = cplx_sub(c_arr+k, &c_temp);
    				DBG_PRINTF("AL(%u) = A(%u) - A(%u)WNp\n", k+B, k, k+B);
    				// DBG_PRINTF("sub:(%1.f+%1.fj) - (%1.f+%1.fj)=(%1.f+%1.fj)\n",
    				// 	(c_arr+k)->real, (c_arr+k)->imag, c_temp.real, c_temp.imag, (c_arr+k+B)->real, (c_arr+k+B)->imag);
    				
    				*(c_arr+k) = T;
    			}
    		}
    		putchar('\n');
    	}
    	DBG_PRINTF("FFT done!!!\n\n");
    	return 1;
    }
    
    void cplx_amp_angle_batch(complex_t* c, unsigned int N, complex_ap_t* c_ap)
    {
    	unsigned int i = 0;
    	for (i = 0; i < N; ++i) {
    		*(c_ap+i) = cplx_amp_angle(c+i);
    	}
    }
    
    void fft_test()
    {
    	unsigned int i = 0, j;
    	unsigned int N = 8;
    	float angle = 0, abs = 0;
    	complex_t c_arr[8] = {
    		{1, 2},
    		{3, 0},
    		{5, 0},
    		{7, 0},
    		{1, 0},
    		{3, 0},
    		{5, 0},
    		{7, 0}
    	};
    	complex_t* c_cpy = (complex_t*)calloc(N, sizeof(complex_t));
    	memcpy(c_cpy, c_arr, N*sizeof(complex_t));
    
    	complex_ap_t* c_ap = (complex_ap_t*)calloc(N, sizeof(complex_ap_t));
    
    	fft(c_cpy, N);
    	cplx_amp_angle_batch(c_cpy, N, c_ap);
    
    	printf("i\torigin data\tfft data\tamp\tpha\n");
    	printf("-\t-----------\t--------\t---\t---\n");
    	for (i = 0; i < N; ++i) {
    		printf("%d\t%.2f + %.2fj\t%.2f + %.2fj\t%.2f\t%.2f\n",
    			i, c_arr[i].real, c_arr[i].imag, 
    			(c_cpy+i)->real, (c_cpy+i)->imag,
    			(c_ap+i)->amp, (c_ap+i)->pha );
    	}
    }
    
    
    void fft_test_read_data_from_file()
    {
    	int i, N;
    	complex_t c;
    	char filename[] = "fft_rawdata.txt";
    	FILE* fp = NULL;
    
    	fp = fopen(filename, "r+");
    	if (fp == NULL) {
    		printf("open %s failure!\n", filename);
    		exit(0);
    	}
    	fscanf(fp, "%d", &N);
    	complex_t* c_arr = (complex_t*)calloc(N, sizeof(complex_t));
    	complex_ap_t* c_ap_arr = (complex_ap_t*)calloc(N, sizeof(complex_ap_t));
    
    	i = 0;
    	while(i < N) {
    		fscanf(fp, "%f\t%f", &(c_arr+i)->real, &(c_arr+i)->imag);
    		printf("%.1f + %.1fj\n", c_arr[i].real, c_arr[i].imag);
    		i++;
    	}
    	fclose(fp);
    
    	printf("FFT begin!\n");
    	fft(c_arr, N);
    	printf("FFT done!\n");
    	strcpy(filename, "fft_cookeddata.txt");
    	fp = fopen(filename, "w+");
    	if (fp == NULL) {
    		printf("open %s failure!\n", filename);
    		fclose(fp);
    		exit(0);
    	}
    	i = 0;
    	while(i < N) {
    		c_ap_arr[i].amp = cplx_amp(c_arr+i);
    		c_ap_arr[i].pha = cplx_angle(c_arr+i);
    		printf("%.1f + %.1fj ---> amp=%.1f, pha=%.1f\n", 
    			c_arr[i].real, c_arr[i].imag, c_ap_arr[i].amp, c_ap_arr[i].pha);
    		fprintf(fp, "%f\t%f\n", c_arr[i].real, c_arr[i].imag);
    		i++;
    	}
    	fclose(fp);
    }
    
    int main(int argc, char const *argv[])
    {
    	fft_test();
    	// fft_test_read_data_from_file();
    
    	return 0;
    }
    

    fft_test()函数的执行结果:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldTCAMos-1609315289573)(imgassets/fft_result_with_amp_pha.jpg)]

    总结

    fft函数传入的是数据指针,因此会修改原数据,如果还需要使用到原始数据,那么请copy一份。

    总结个锤子,后天考移动通信,cdj,你还这么浪,赶快滚去复习。

    fft_test()函数的执行结果:

    在这里插入图片描述

    展开全文
  • 日语笔记(2) 动词ます

    千次阅读 2021-03-02 22:32:22
    1. (第一种)一类动词ます   词尾う段→い段,+ます     ● 書く(かく)→ 書きます(かくます)     ● 泳ぐ(およぐ)→ 泳ぎます(およぎます) &...
  • 情人节将至,我用R语言的grid包画了几幅图片,希望此平台赠与我相恋五年的男友,也希望与各位统计爱好者分享快乐。 首先,我利用grid.lines()把转化为直角坐标系的(x, y)两两相连围成心形,构建了一个heart ...
  • 微信小程序组件 —— 树表格

    千次阅读 2020-07-29 09:40:17
    如之前那篇树选择下拉框文章所说,我终于完成了微信小程序树数据表格组件,其实主要的思想还是树结构的递归。我先放一下示例图: 因为现在只是说项目以后可能会用到这个组件,所以现在只是搭了个简单的样子,...
  • 图像桶畸变矫正

    千次阅读 2019-02-15 15:00:17
    转载自:_寒潭雁影的 C/C++ 图像处理(9)------图像の桶畸变矫正 原文:https://blog.csdn.net/weixinhum/article/details/50719031  广角镜头的摄像设备拍摄出来的图像经常会有桶畸变的问题。原因在于广角...
  • 建行APP首页有个圆形菜单.仿了个玩具出来. 功能介绍: 1.一个圆形背景.六个item菜单.... 2.触摸滚动....速度较大时,随手指滚动,手指抬起,还会自动滚动一段时间;...CSDN微信小程序开发-专栏,欢迎关注!...
  • JavaScript 打印星号三角形

    千次阅读 2018-11-24 04:49:31
    什么会这么用除2判断余数来标识32,16,8421码的位是否存在的方式来组合总空格的长度以及用空格double的方式实现复杂度O(log2(n)), 首先考虑的是先生成第一层最长的空格, 然后依次递减. 其实这是个str.repeat()从O(n...
  • java实现心形图案桃心

    千次阅读 2020-12-20 13:46:39
    相信对于打印三角形都没什么难度,只必要诳骗for轮回嵌套驾驭就行可是看待打印圆形和三角形分袂原故到圆心隔绝相称的点大凡不会横坐标和纵坐标都为整数打印爱酷爱心的公式(x²+y²-1)³-x²*y³=0调...不日(2019/8/7...
  • 选择器是将element中的el-select与el-tree结合起来,也可以将el-popover和le-tree结合起来,将下拉框的内容变为树的数据,这里的选择都是用的复选框,即使是单选。树选择器中el-select与el-tree的方式会比较...
  • 当然咯,为什么没有量能呢,那是因为创业板行情临近尾声了,庄家这里向上虚晃一枪搞了个假突破;还可以事后从2月份高点的略微放量筑顶看出来。事先也可以判断,那就是突破时机过晚,已经临近三角形末端了。假突破...
  • word2010如何画直线,曲线,肘连接符,曲线连接符,等多种直线和曲线类型时间:2012-04-18作者:snow来源:互联网word2010如何画直线,曲线,肘连接符呢?Word2010提供了多种直线和曲线类型,包括“直线”、“肘连接符...
  • csrf理解session原理

    万次阅读 2021-04-16 22:31:28
    执行完这个程序后,我们可以到系统临时文件夹找到这个 Session 文件,一般文件名如:sess_4c83638b3b0dbf65583181c2f89168ec,后面是 32 位编码后的随机字符串。用编辑器打开它,看一下它的内容: admin|N; 一般...
  • 汉诺塔理解栈与递归 单调栈 双端单调队列 单调队列优化的背包问题 01背包问题 完全背包问题 多重背包问题 串的定长表示 串的堆分配实现 KMP 一、引子 二、分析总结 三、基本操作 四、原理 五、复杂度分析 ...
  • 什么是J2EE

    万次阅读 多人点赞 2017-03-12 23:02:31
    什么是J2EE
  • 古代小说戏曲专题考任务1试题答案 认真阅读教材关于《宋元话本小说和明清拟话本拟话本》的论述,选读宋元话本和明清拟话本经典作品,并完成以下任务。 一、婚姻爱情和断案折狱是话本、拟话本最重要的题材类型,请...
  • 银行核心系统是什么?

    千次阅读 2021-07-22 17:35:24
    银行核心系统是什么? 2011-01-03 csdn银行核心系统是什么 银行核心系统的英文原意CORE Banking, CORE其实不是“核心”的意思这么简单,它的全称是: Centralized Online Real-time Exchange (集中式在线实时交互...
  • 将常用的运动规律分析方法与三维软件的参数化造型设计相结合,为一般圆柱凸轮的参数化设计提供了一个可靠的设计方法,对凸轮机构的改型设计及参照设计提出了可供签的案例。
  • 动词各活用的形成及例句 一,未然 1 变化规则 ① 五段动词:动词词尾变成其所在行的あ段字。 読む(よむ) 「词尾所在行:ま行、あ段字:ま」==よま 書く(かく) 「词尾所在行:か行、あ段字:か」==か...
  • 在香灰上放上云母、砂片等薄而硬的“隔火”,再放上香丸、香饼,着灰下炭墼的微火烤焙,慢慢将香芬挥发出来,既减少烟气,也使香气更为舒缓悠长。各种形态的香炉,则为这一缕香烟缭绕得如诗如画,香炉多以狮子、小鸭等...
  • 十进制(Decimal)的特点 十进制的基数为"10",有10个数字符号:0、1、2、3、4、5、6、7、8、9,各位权是 以10为底的幂,进()位规则为逢十进一(一为十)。例如: 十进制: 1 9 9 8 . 2 1 5 各位权: 103 102 ...
  • 变长参数(variable number of arguments) ...一个函数要访问变长参数,需要由{…}形式来访问,此时变长参数被转化为了一个数组。 function add(...) local s = 0 for i,v in ipairs{...} do s = s + v end

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,930
精华内容 7,572
热门标签
关键字:

借什么什么形