我有一个信号x [n],使用fft
对其进行转换,并通过对幅度响应进行排序来提取主频率。计算平均值为avg = mean(xn)
,其中xn
是包含信号数据的1x3142矩阵。
如何使用此信息绘制原始信号的近似值?老实说,我不知道该怎么做。考虑使用ifft
,但我不知道平均值和主导频率应该如何帮助我。
原始信号:
幅度响应:
答案 0 :(得分:3)
好的,所以这是我拙劣的尝试。您需要做的是绘制光谱并确定最大峰值 - 这是平均值以及第二大峰值,它将为您提供主导频率。我注意到点之间的采样时间并不是一成不变的,但我们希望它不会干扰事物,这应该给我们一个很好的信号。
BTW,我增加了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处的点是DC偏移/平均值。因此,创建一个新信号,我们只在频域中复制这三个位置,撤消移位,反转,并且还会限制任何剩余的虚部。
您还会注意到输出长度是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);
我们得到了这个:
正如你所看到的,这不是一个好的重建。您的数据存在很大的可变性,这就是为什么只有一个显性正弦曲线不足以重建这些数据。然而,平均值或多或少是可以的,并且原始和重建之间的振荡是相同的....因此占主导地位的东西确实起作用,但是这里没有模拟高变异性。