【问题标题】:Count the number of Cos and sine waves in a raw signal计算原始信号中余弦波和正弦波的数量
【发布时间】:2015-02-16 21:41:54
【问题描述】:

我正在尝试生成一个分数或一个数字,它表示有多少 cos 和 sin 波可以生成我的信号。例如,如果信号是正弦波,这意味着它是 100% 纯的,因为它只能由一个正弦信号生成,如果它由两个正弦波组成.. 这意味着它不是纯波,如果它由 100 个正弦波组成波浪它真的很不纯等等....我尝试了 FFT 和 FS 但它没有工作...有人可以帮助我吗??

【问题讨论】:

  • 这些正弦波的频率是否是彼此的整数倍?即它们是谐波相关的吗?
  • 我的信号由随机原始数据组成,据我所知,每个信号都可以从具有不同放大器、频率和相位的多个正弦波和余弦波生成......但我想知道如何做到这一点.
  • 最简单的方法可能是使用 fft() 函数,然后使用 findpeaks()。如果需要,还有其他更细微的方法来计算组件(例如,MUSICPisarenko),但我会从 fft() 开始。
  • 但是 FFT 有一个限制,因为它的范围从 -pi 到 pi ,我可以在正常信号中使用它还是应该使用傅里叶级数?
  • 您的信号可能已被采样,因此应该是带限的。否则,您应该使用网络分析仪或其他一些硬件。在这一点上,如果您需要真正的帮助,您需要提供更多详细信息,说明您究竟拥有什么以及您的理解程度如何,因为您的担忧对我来说没有意义。

标签: matlab


【解决方案1】:

FFT 将起作用。 您必须使用傅里叶变换处理波,然后计算幅度 sqrt(real*real + image*image)。计算结果的峰值将为您提供不同频率的正弦波数量。

【讨论】:

  • 最好使用傅里叶级数还是 FFT,因为我知道它有一个从 -pi 到 pi 的限制 .. 我们应该计算 sqrt(realreal + imageimage) 用于所有样本还是什么?
  • fft_data = fft(sinwave, FFT_SIZE); FFT_SIZE 必须是 2 的幂,例如 4092。是的,您应该处理正弦波的一个有趣片段,尽管您处理的样本越多,等待结果的时间就越长。
  • 但关键是我的信号不是正弦波..它是原始数据
  • 就是这样,您应该将原始数据传递给 fft 函数。只要算法能在你的数据中找到重复的模式,结果就会更好。如果只是像信号噪声这样的随机数据,fft 可能会返回非常低的频率。
  • 谢谢 Jacek .. 我只需要了解为什么我们在计算 FFT 后计算 sqrt(realreal + imageimage) 以及最后如何计算峰值?
【解决方案2】:

给你:

x = s;
X = dct(x);
[XX,ind] = sort(abs(X),'descend');
i = 1;
while norm(X(ind(1:i)))/norm(X)<0.99
   i = i + 1;
end
Needed = i;

【讨论】:

  • 我不明白这个'完美工作'的原理!?即使是最简单的测试用例 t = linspace(0,10,100); s = sin(t); 也不起作用。
  • 这个工作原理背后的一些解释或理由会很好。我不明白这应该如何工作。
  • 当我放置一个正常信号时,“需要”变量包含重建信号所需的少量分量。另一方面,如果我输入一个嘈杂的信号,“需要”变量具有大量分量,这表明它需要大量分量来重建信号。这是我可以使用的完美乐谱。
  • @SMH - Needed 变量只是一个数字,它(看起来)在标准误差的 1% 范围内表示信号所​​需的组件总数。我也不明白为什么需要对系数进行排序。
猜你喜欢
  • 1970-01-01
  • 2016-06-16
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多