本题是ee261中Problem Set 4的一道matlab代码题,主要用到了fft和频域的相关知识。
ee261相关知识点整理博客:https://www.cnblogs.com/TaigaCon/p/5079156.html
坑点
1.matlab的fft函数
首先,根据傅里叶变换的公式可以得知,频域的F(s)关于y轴共轭对称,也就是说两边实部相同而虚部相反。然而,现实中正数频率才有意义,负数频率的数据则使用其它方法处理。
在matlab中,对时域数据进行fft处理后,得到的频域数据前一半为正数频率下的频谱,也就是现实中有意义的数据;而后一半为负数频率下的数据,可以直接删除掉;或者使用fftshift。
但是在频域处理之后,ifft之前要注意恢复到matlab fft之后的模式(即前一半正频率,后一半负频率,两部分关于中间对称),否则点数N都对不上,这肯定是不对的。
参照:https://www.zhihu.com/question/39212146/answer/80239362
第三个回答
2.ifft后取时域信号的实部而非模值
见matlab代码最后,如下写法是错误的:
1 | xDecode = abs(ifft(yDecode)); |
正确如下式:
1 | xDecode = real(ifft(yDecode)); |
matlab代码
1 | %https://see.stanford.edu/materials/lsoftaee261/PS-4-2007.pdf |