function [Am,pha]=dft2(x) % x: 输入信号 % X: FFT结果 N = length(x); if N == 1 X = x; else % 分离偶数点和奇数点 xe = x(1:2:N); xo = x(2:2:N); % 递归进行FFT变换 Fe =dft2(xe); Fo = dft2(xo); % 计算旋转因子 Wn = exp(-2*pi*1i/N).^(0:(N-1)/2); % 组合偶数点和奇数点的FFT结果 X = [Fe + Wn.*Fo, Fe - Wn.*Fo]; end Am = abs(X); % 计算幅频特性 pha = angle(X); % 计算相频特性.这段代码为什么求不出FFT的相位谱
时间: 2023-06-25 16:05:21 浏览: 89
这段代码中计算相位谱的方法是使用 `angle(X)` 函数,该函数可以计算出复数的幅角或相位角,但是需要注意的是它只能计算出 $[-\pi,\pi]$ 范围内的相位角。因此,如果相位角超过了这个范围,那么计算结果就会出现错误。
在这段代码中,当递归到最后一层时,FFT的结果是一个长度为1的向量,它的相位角一定在 $[-\pi,\pi]$ 范围内,因此可以正确计算相位谱。但是在其他层次上,由于每次递归都会乘上旋转因子 $W_n$,这就会导致幅角的变化,有可能超过了 $[-\pi,\pi]$ 的范围,因此最终的结果就不正确了。
要解决这个问题,可以使用 `unwrap()` 函数来对相位角进行展开,使得所有的相位角都在 $[-\pi,\pi]$ 范围内。修改后的代码如下:
```
function [Am, pha] = dft2(x)
% x: 输入信号
% Am: 幅频特性
% pha: 相位谱
N = length(x);
if N == 1
Am = x;
pha = 0;
else
% 分离偶数点和奇数点
xe = x(1:2:N);
xo = x(2:2:N);
% 递归进行FFT变换
[Fe, pea] = dft2(xe);
[Fo, poa] = dft2(xo);
% 计算旋转因子
Wn = exp(-2 * pi * 1i / N) .^ (0:(N - 1) / 2);
% 组合偶数点和奇数点的FFT结果
F = [Fe + Wn .* Fo, Fe - Wn .* Fo];
% 计算幅频特性
Am = abs(F);
% 计算相位谱
pha = unwrap([pea, poa] + angle(Wn .* Fo));
end
```
在这个修改后的代码中,`unwrap()` 函数被用来展开相位角,使得所有的相位角都在 $[-\pi,\pi]$ 范围内。同时,在计算相位谱时,也需要加上旋转因子的相位角,这是因为旋转因子的相位角也会影响最终的相位谱。
阅读全文