之间的区别呸呸呸_ _fft和d f t米tx _dftmtx在 MATLAB 中

信息处理 matlab fft 离散信号 傅里叶变换 自由度
2022-02-04 12:41:30

我有以下 MATLAB 代码:

audioFile= audioread('myFile');
%% Reshape according to the given distortion period
distortionPeriod = 512;
audioFile= length(audioFile) / distortionPeriod;
audioFile= reshape(audioFile, [newLength, distortionPeriod]);

我注意到以下区别:

 audioFileFft = fft(audioFile); % incorrect transform
 audioFileDftMat = audioFile * dftmtx(distortionPeriod); % correct transform

>> norm(audioFileFft - audioFileDftMat )

ans =

   1.2985e+03

为什么存在这种差异?正如MATLAB dftmtx 的文档所提到的,我希望这两个操作(fft, dftmtx)会给出相同的结果

我怎样才能使用fft并且仍然获得与使用 相同的结果dftmtx

2个回答

你得到audioFile的线audioFile= length(audioFile) / distortionPeriod;是一个数字,而不是一个矢量信号。

出于这个原因,您的audioFileFftaudioFileDftMat是从处理该数字而不是您的初始信号向量中计算出来的audioFile这不是你的意图。但是,如果该行是 for newLength,并且这个变量是一个整数(即初始audioFile长度是 的倍数distortionPeriod,这里是 512),那么你可以这样做

audioFileFft = fft(audioFile, distortionPeriod, 2);  
audioFileDftMat = audioFile*dftmtx(distortionPeriod);

结果norm(audioFileFft - audioFileDftMat)应该非常小。

该命令fft沿其输入矩阵的每一列计算 FFT。如果我理解正确,您希望沿行进行 FFT。一种方法是

audioFileFft = fft(audioFile');

使用 DFT 矩阵也可以做到这一点(尽管效率要低得多):

audioFileDftMat = dftmtx(distortionPeriod) * audioFile';