matlab 自己构造DFT函数

博客介绍了MATLAB中实现离散傅里叶变换(DFT)的函数`dft()`,并通过与内置的快速傅里叶变换(FFT)函数进行比较,验证了自定义DFT函数的正确性。示例代码展示了对一个正弦信号`s`进行DFT和FFT,并用`stem4`函数绘制频域波形,结果显示两者结果一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码如下:

function sw = dft(st)
% DFT - Discrete Fourier Transform

M = length(st);
N = M;
WN = exp(2*pi*j/N);

% Main loop
for n=0:N-1
    temp = 0;
    for m=0:M-1
        mn = m'*n;
        WNmn = WN.^mn;
        temp = temp + st(m+1)*WNmn;
    end
    sw(n+1) = temp;
end

end

在matlab命令行中输入如下命令

s = sin(((1:64)-1)2pi*12.5/100);
figure(1);plot(s);figure(2);stem4(dft(s));figure(3);stem4(fft(s));

得到
请添加图片描述请添加图片描述
经验证,该DFT函数得到的频域波形与FFT相同,正确。

### 如何在MATLAB中编写DFT变换函数 尽管MATLAB提供了内置的 `fft` 函数来执行快速傅里叶变换(FFT),了解如何手动实现离散傅里叶变换(DFT)对于深入理解其原理非常重要。下面展示了一个基于定义的手动实现DFTMATLAB代码示例。 #### 手动实现DFT的理论基础 离散傅里叶变换的核心公式如下: \[ X(k) = \sum_{n=0}^{N-1} x(n)e^{-j2\pi kn/N}, \quad k = 0, 1, ..., N-1 \] 其中 \(x(n)\) 是输入序列,\(X(k)\) 是对应的频率分量,\(N\) 是采样点数[^1]。 以下是具体实现该公式的MATLAB代码: ```matlab function Xk = dft(xn) % 输入参数 xn: 时间域信号向量 N = length(xn); % 获取信号长度 n = (0:N-1)'; % 创建时间索引列向量 k = (0:N-1); % 创建频率索引行向量 WN = exp(-1i * 2 * pi / N); % 计算旋转因子WN Wnk = WN .^ (n*k); % 构造W矩阵 Xk = Wnk * xn; % DFT计算 end ``` 此代码实现了标准的DFT算法,适用于任何有限长度的实数或复数序列。注意,这种方法的时间复杂度为 O(N²),因此不推荐用于非常大的数据集;在这种情况下应考虑使用更高效的 FFT 方法。 #### 使用示例 为了验证上面编写的DFT函数,可以尝试将其应用到简单的正弦波形上,并比较结果与MATLAB自带的 `fft` 函数的结果。 ```matlab % 定义测试信号 fs = 100; % 采样率(Hz) t = 0:1/fs:1-1/fs; % 时间向量(秒) f = 5; % 正弦波频率(Hz) xn = sin(2*pi*f*t); % 测试信号 % 调用手写dft函数 Xk_manual = dft(xn); % 对比MATLAB内置fft函数 Xk_builtin = fft(xn); % 显示两者差异 disp('最大误差:'); disp(max(abs(Xk_manual - Xk_builtin))); ``` 以上脚本不仅展示了自定义DFT函数的应用场景,还通过对比确认了其实现的有效性和准确性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值