【问题标题】:Finding phase difference between two complex exponential functions in MATLAB在 MATLAB 中查找两个复指数函数之间的相位差
【发布时间】:2021-04-14 16:25:45
【问题描述】:

我在 MATLAB 中创建了两个复指数函数,它们的频率相同但相位不同。下面给出了用于创建复指数函数的 MATLAB 代码:

% First complex exponential generation
Fs = 5000; % sampling frequency
f1 = 5; % frequency
vector = linspace(0,1,Fs);
exp1 = exp(1i*(2*pi*f1.*vector));


% Second complex exponential generation
Fs = 5000;
f1 = 5;
vector = linspace(0,1,Fs);
exp2 = exp(1i*(2*pi*f1.*vector)).*exp(1i*pi/7); % Giving phase shift of pi/7

我想计算这两个函数之间的相位差(在这种情况下是已知的,即 pi/7),以便在实际情况下,这个相移可以用作校正相位差的反馈,并且两个函数都可以变得完全一样。

【问题讨论】:

  • 简单的解决方案是使用互相关。第一个峰值的位置会告诉您相位差。

标签: matlab exponential phase


【解决方案1】:

由于您似乎对找到单个频率的相位感兴趣,因此我编写了代码来计算每个信号的 fft,然后找到峰值频率,然后计算该频率处的相位差。您计算正弦波的方式会生成复数,因此我还添加了代码以使用 sin 函数来避免生成复数,但该代码适用于实数或复数。我让它在屏幕上写下实际相位和计算相位,这样您就可以更改实际相位并轻松验证相位计算是否正确。

% First sine wave
Fs = 50; % sampling frequency
max_time = 20;
f1 = 5; % frequency
time = (0:(round(max_time * Fs) - 1)) / Fs;
%exp1 = exp(1i*(2*pi*f1*time));
exp1 = sin(2*pi*f1*time);


% Second sine wave
actual_phase_diff = pi/7
%exp2 = exp(1i*(2*pi*f1*time)).*exp(1i*actual_phase_diff); % original sine code
exp2 = sin(2*pi*f1*time + actual_phase_diff); % my sine code

fft_exp1 = fft(exp1);
fft_exp2 = fft(exp2);

if mod(length(fft_exp1), 2) > 0
    % length is odd
    max_freq_idx = (length(fft_exp1) + 1) / 2;
else
    % length is even
    max_freq_idx = length(fft_exp1) / 2 + 1;
end

% Find the point in the fft with the highest value
[~, peak_idx] = max(fft_exp1(1:max_freq_idx));

calc_phase_diff = angle(fft_exp2(peak_idx)) - angle(fft_exp1(peak_idx))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2015-12-13
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多