使用平均值和主频率近似信号

Approximate a signal using average value and dominant frequency

我有一个信号 x[n],使用 fft 对其进行变换,并通过对振幅响应进行排序来提取主频率。计算平均值为 avg = mean(xn) ,其中 xn 是包含信号数据的 1x3142 矩阵。

如何使用此信息绘制原始信号的近似值?老实说,我不知道该怎么做。想用 ifft 但我不知道平均值和主频率对我有什么帮助。

原始信号:

振幅响应:

好吧,这是我在这方面的拙劣尝试。您需要做的是绘制频谱并确定最大峰值 - 这是平均值以及第二大峰值,它将为您提供主频率。我注意到点之间的采样时间不是恒定的,但我们希望这不会干扰事物,这应该会给我们一个很好的信号。

顺便说一句,我增加了 FFT 的点大小以增加频谱的分辨率,这样我们就可以更好地近似峰值的位置。因此,让我们绘制频谱并确保移动频谱,使中心频率位于中间,而不是左侧:

N = 4096; %// FFT point size
F = fft(ssd(:,2), N);
Fs = fftshift(F);
mag = abs(Fs); %// Magnitude spectrum shifted
plot(1:N, abs(mag)); %// Plot the spectrum

这就是我们得到的,我添加了一些数据游标来帮助举例说明我的观点:

请注意,我已经手动检查了峰值的位置,因为对它们进行排序并选择最大的组件并不是最好的处理方式。最大的峰值显然是 DC 值,但是最大峰值之后的较大值不一定能给您正确的结果,正如您在此处看到的那样。因此,您可以 运行 通过峰检测算法获得主峰,但我会避免这种情况给您一个结果。

如您所见,在偏移频谱中,位置 2018 和 2080 处的点对应于我们的主峰,而 2049 处的点是直流偏移/平均值。因此,创建一个新信号,我们只复制频域中的这三个位置,撤消移位,取反,并关闭任何剩余的虚部。

您还会注意到输出长度是 FFT 点大小。您需要删除额外的输出,并且只显示原始信号包含的内容:

%// Create blank array
out_reconstruct = zeros(N,1);

%// Copy values over from shifted spectrum
out_reconstruct([2018 2049 2080]) = Fs([2018 2049 2080]);

%// Reconstruct in time domain and cap
out_reconstruct = real(ifft(ifftshift(out_reconstruct)));
out_reconstruct = out_reconstruct(1:size(ssd,1));

%// Plot
plot(ssd(:,1), ssd(:,2), ssd(:,1), out_reconstruct);

我们得到这个:

如您所见,这不是一个好的重建。您的数据存在高度可变性,这就是为什么只有一个主要正弦波不足以重建此数据的原因。然而,平均值或多或少是可以的,原始和重建之间的振荡是相同的....所以主导的东西确实有效,但这里没有模拟高可变性。