【问题标题】:How to "enforce" the frequency of one signal on the other; two signals with different frequencies如何将一个信号的频率“强制”到另一个信号上;两个不同频率的信号
【发布时间】:2015-10-27 06:53:33
【问题描述】:

我需要测量两个不同频率信号之间的某些参数。即,滞后/相位差。

我知道我不能使用 xcorr,例如,因为频率不同。

数据示例:

如果需要,我可以附上数据。

我可以使用以下方法测量两个信号的频率:

%calculate frequencies 
[maxValue1,indexMax1] = max(abs(fft(sig1-mean(sig1))));
f1 = indexMax1 * 100 / 100;

[maxValue2,indexMax2] = max(abs(fft(sig2-mean(sig2))));
f2 = indexMax2 * 100 / 100;


%which one is higher?
maxF = max (f1, f2);

如何强制/更改任一信号的频率以使其与另一个信号相同?例如,两个信号的频率都应该是 maxF。

【问题讨论】:

  • 为什么幅度不应该改变?要估计相位滞后,不需要真实的幅度。
  • 你是对的。如果他们改变了也没关系。
  • 您想“改变信号的频率”? ...您是首先生成信号还是测量它?

标签: matlab signal-processing frequency similarity


【解决方案1】:

FFT 可能不是完成您想做的事情的最佳方式。如果您的两个信号中的每一个都是真正的单分量(即,它们不是多个正弦波的混合),那么您可以使用希尔伯特变换获得更好的性能。希尔伯特将您的实信号转换为复信号。它还允许您非常轻松地直接评估相位、频率和幅度。

%convert to complex domain
h_sig1 = hilbert(sig1);
h_sig2 = hilbert(sig2);

%plot instantaneous phase of the signals
phase_sig1_rad = angle(h_sig1);  %radians
phase_sig2_rad = angle(h_sig2);  %radians
dphase_rad = wrapTo2Pi(phase_sig1_rad - phase_sig2_rad);
plot([phase_sig1_rad(:) phase_sig2_rad(:) dphase_rad(:)]);

%other info: compute the frequency of the signals
dt_sec = 1/sample_rate_Hz;  %what is the time between samples
freq_sig1_Hz = diff(unwrap(phase_sig1_rad))/(2*pi)/dt_sec;
freq_sig2_Hz = diff(unwrap(phase_sig2_rad))/(2*pi)/dt_sec;

%other info: compute the amplitude of the signals
amp_sig1 = abs(h_sig1);
amp_sig2 = abs(h_sig2);

希望这会有所帮助!

【讨论】:

  • 非常感谢。这很有帮助,我不知道为什么我从来没有这样想过!你确定 wrap 有效吗? 'double' 类型的输入参数的未定义函数 'wrap'。
  • 我正在尝试查找函数包装所需的工具箱 - 似乎找不到!
  • 糟糕!对不起。 Matlab 的内置函数是 wrapTo2PI()。我编辑了上面的帖子。或者,您可以使用 angle = angle - 2*pi*floor(angle/(2*pi)) 代替 wrap
  • wrapTo2Pi 在我没有的映射工具箱中,让我尝试另一种方式。非常感谢。
  • 别在意最后一条评论,我搞定了!谢谢。只是要清楚 dphase_rad 是相位差吗?想象一下,如果我还想查看频率和幅度的差异。在这里可以做一个简单的减法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
相关资源
最近更新 更多