for
循环
--
以
DFT
变换矩阵为例
缘起:大家都知道
MATLAB
中用
for
循环编写的代码执行起来效率不高,如何用矩阵和向量的运算提升效率对每一个
用
matlab
的人来说都是很有必要的,但是此项功夫高手一般不愿意给初学者讲,此功夫是高手和低手的分水岭,高手
们更是拿此功夫在初学者面前炫耀。本人当初怀着很恭敬的心向高手请教,高手笑笑说这要我自己编。出于让后来人
受益,帮助和我一样无助的求知者。本人今天话了一天时间将此问题研究下,并且将代码毫无保留的公布出来。希望
大家能够受益,阿弥陀佛!
上述
W
矩阵的第一列代表直流成分,第二列到最后一列是信号的交流成分,可以看出倍频关系!我以前不知道
DFT
可以通过矩阵表示。注意
matlab
中
dftmtx
实现上述
W
矩阵的时候没有用
1/sqrt(N)
进行归一化!可以通过
dftmtx(2)
验证,没有
1/sqrt(2)
。
例
1 DFT matrix
是
Hermitian
的
Nfft = 8; xn=rand(1,Nfft);
y=dftmtx(Nfft)*xn.'
%
结果是个列向量
y=dftmtx(Nfft)*x.'
和
y=fft(x,Nfft)
是等价的
y = xn*dftmtx(Nfft)
%
结果是个行向量
y=fft(xn,Nfft) %
结果是个行向量
%dft
变换公式,
n
代表时域采样点,
k
代表频域采样点
Y(k)=sum(x.*exp(-j*2*pi*n*k))
相应的,
dftmtx(Nfft)
产生的矩阵中,
第
k
行,
n
列元素
=exp(-j*2*pi*k*n/Nfft)
,
与
x.'
相乘正好对应
fft
变换后的每个
频点值。