近期用verilog去做FFT相关的项目,需要用到matlab进行仿真然后和verilog出来的结果来做对比,然后计算误差。近期使用matlab犯了一个错误,极大的拖慢了项目进展,给我人都整emo了,因为怎么做仿真结果都不对,还好整体的代码都是我来写的,慢慢往下找就找到了问题的来源,全网没有看到多少人把这个愚蠢的错误写出来,我来引入一下。
代码错误的表现:复数向量的虚部被取反,正数变成负数,负数变成正数。
首先讲一下我做了什么,以及这个错误出现的原因:
- 我习惯在变量区查看变量,然后大致对照一下输入输出对不对。
- 如果一个矩阵是很长的行矩阵,例如1*512,我就习惯把它转置过来看,例如图1中matlab变量区的最左边变量cmplx_wave_single,按照图2,右键点击空白处,然后点击“转置变量”,这样倒过来看会看得更多更全。我以为这个转置就是线性代数的转置,值是不变的,但是!!!!!并不是!!!!!
一、共轭转置和点转置的区别
接下来我们用一段简单的matlab代码解释这个问题
clc; clear; close all;
cmplx_wave_single = 1 + 1j*9;
cmplx_wave_single_transposition=cmplx_wave_single';
cmplx_wave_single_transposition_point=cmplx_wave_single.';
输入如图
cmplx_wave_single是正常的输出。
cmplx_wave_single_transposition=cmplx_wave_single';是平常我们常用的矩阵转置,也等同于图2使用变量区的“转置变量”的效果。可以看到这实际上是一种共轭转置,即实部不变,虚部取反。在只有实数的情况下,使用这种转置并不会有什么问题,但是一旦是复数,那么虚部的值全部取反就会有大问题!靠!让我再骂一句!太坑了!!!!!
cmplx_wave_single_transposition_point=cmplx_wave_single.';是点转置,不会导致虚部的值有变化,是真正线性代数意义上的转置,只改变值的位置,不改变值的大小。
二、总结
想要不犯这样的错误:
1、如果有手册,可以几倍速看完手册,像学IP核一样,把要学的快速看一遍,不求甚解,这样碰到问题的时候能大概知道问题出在哪个位置
2、当然,如果能在工程中,碰到问题解决问题,这或许才是最好的。GTP不行google,实在google不行就摇人。
3、相信matlab,相信modelsim,适当取消质疑精神,软件很成熟了,有问题一定是没有正确使用软件。
4、碰到一个问题,只要确认方向是对的,问题就出现在路上,就不要避开它,一直抽丝剥茧把它拿下来为止,因为问题不解决,迟早还会碰到。这样迟早还会犯错,必须要弄懂这个问题产生的根本原理,才能放心的进行接下来的工作,否则根基不稳,后续系统变得庞大,根本找不到问题。
就像建设一条高速公路,建设的时候有个地方不知道有坑,但是就是把它绕过去了,一旦高速公路开始运行,出现问题,你会感觉哪哪都是坑,无从下手。