STM32/STM8技术william hill官网
直播中

2111080

2年用户 4经验值
擅长:嵌入式技术
私信 关注
[问答]

FFT的幅值对应的频率点不对

使用定时器来采集ADC,采集频率10k,采集点数1024,
当波形频率为1562.5Hz时,计算应该在Output[160]处有幅值为1,然而fft_outputbuf[160]=0.066404,fft_outputbuf[162]=1.056113

当波形频率为3125Hz时,计算应该在Output[320]处有幅值为1,
然而fft_outputbuf[320]=0.011499,fft_outputbuf[324]=0.932195

当波形频率为4687.5Hz时,计算应该在Output[480]处有幅值为1,然而fft_outputbuf[480]=0.020290,fft_outputbuf[486]=0.769035

采集数据用matlab画图,也是一样
被采集波形频率为1k时,数据转化后显示1015.62
被采集波形频率为976.5时,数据转化后显示996.054

回帖(1)

小黑羊

7 天前
FFT(快速傅里叶变换)是一种常用的信号处理技术,用于将信号从时域转换到频域。在您的案例中,您使用FFT来分析采集到的信号,并尝试找到特定频率的幅值。然而,您遇到了一些问题,即实际的FFT输出与预期的频率点和幅值不匹配。这可能是由几个因素引起的:

1. **采样频率和分辨率**:FFT的分辨率取决于采样频率和采集的点数。在您的案例中,采样频率为10kHz,采集点数为1024,这意味着FFT的频率分辨率为10kHz / 1024 = 9.765625Hz。因此,理论上FFT的输出应该在整数倍的分辨率处有峰值。

2. **窗函数**:在进行FFT之前,通常需要对信号应用窗函数以减少频谱泄漏。如果您没有应用窗函数,或者应用的窗函数不适合您的信号,可能会导致频谱分析不准确。

3. **信号的非整数周期性**:如果信号的周期不是采样频率的整数倍,那么在FFT中可能会出现频率偏差。

4. **硬件和实现误差**:ADC的精度、定时器的准确性以及FFT算法的实现都可能影响最终结果。

5. **FFT输出解释**:FFT输出的幅值通常需要除以点数(在您的案例中是1024)来得到实际的幅值。此外,FFT输出的幅值通常是复数,您可能需要取绝对值来得到实际的幅值。

针对您提供的数据,您可以尝试以下步骤来解决问题:

- **检查窗函数**:确保您在FFT之前正确地应用了窗函数。
- **调整采样频率和点数**:如果可能,增加采样频率或采集点数以提高FFT的分辨率。
- **校准硬件**:确保ADC和定时器的设置正确,没有误差。
- **正确解释FFT输出**:确保您正确地解释了FFT的输出,包括幅值的计算和频率的定位。

在MATLAB中,您可以使用以下代码片段来帮助分析和校正FFT结果:

```matlab
% 假设x是采集到的信号,Fs是采样频率
Fs = 10000; % 采样频率
N = 1024; % 采集点数
x = randn(N, 1); % 假设的信号数据

% 应用窗函数
window = hamming(N);
x_windowed = x .* window';

% 进行FFT
X = fft(x_windowed);

% 计算双边频谱
P2 = abs(X/N);

% 计算单边频谱(由于MATLAB的fft函数返回双边频谱)
P1 = P2(1:N/2+1);
P1(2:end-1) = 2*P1(2:end-1);

% 定义频率轴
f = Fs*(0:(N/2))/N;

% 绘制频谱
plot(f, P1);
title('Single-Sided Amplitude Spectrum of x(t)');
xlabel('Frequency (Hz)');
ylabel('|P1(f)|');
```

这段代码可以帮助您更好地理解和校正FFT的输出。如果问题仍然存在,可能需要进一步检查硬件设置或信号处理流程。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分