在 MATLAB 中查找两个复指数函数之间的相位差

问题描述

我在 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,Fs);
exp2 = exp(1i*(2*pi*f1.*vector)).*exp(1i*pi/7); % Giving phase shift of pi/7

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

解决方法

因为您似乎对查找单个频率的相位感兴趣,所以我编写了代码来计算每个信号的 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))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...