在 MATLAB 中查找两个复杂指数函数之间的相位差
Finding phase difference between two complex exponential functions in 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,1,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))
我在 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),以便在实际情况下,可以将此相移用作反馈来校正相位差并且两个功能可以变得完全相同。
由于您似乎对找到单个频率的相位感兴趣,所以我编写了代码来计算每个信号的 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))