硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1500|回复: 16
收起左侧

[技术讨论] 怎么根据采样点计算两个相同频率的正弦波相位差?

  [复制链接]

30

主题

63

回帖

153

积分

初级会员

积分
153
发表于 2024-9-26 08:14:46 | 显示全部楼层 |阅读模式
进来两个标准的正弦波,频率相同,单片机采集一个周期内的多个采样点计算有效值等参数,但怎么根据采样点计算这两个信号的相位差0-360度?求坛友赐教
回复

使用道具 举报

0

主题

14

回帖

14

积分

新手上路

积分
14
发表于 2024-9-26 08:44:58 | 显示全部楼层
all phase fft
回复

使用道具 举报

0

主题

14

回帖

14

积分

新手上路

积分
14
发表于 2024-9-26 08:46:07 | 显示全部楼层
可以试一下ALL PHASE FFT
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2024-9-26 12:10:12 | 显示全部楼层
算出各自第一个的相位,用实部除虚部,然后就得到相位差了
回复

使用道具 举报

44

主题

242

回帖

374

积分

高级会员

积分
374
发表于 2024-9-26 20:49:28 | 显示全部楼层
awu 发表于 2024-9-26 08:46
可以试一下ALL PHASE FFT

这玩意是不是有专利?
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2024-9-27 08:09:47 | 显示全部楼层
用FFT或DFT计算,分别得到两个正弦波的基波初始相位角,两个相位角相减,就是相位差了。如果两个正弦波分别是电网中电压和电流信号,通过这个算法可以得到功率因数。
回复

使用道具 举报

30

主题

63

回帖

153

积分

初级会员

积分
153
 楼主| 发表于 2024-9-27 08:37:57 | 显示全部楼层
qqzhaojs 发表于 2024-9-26 12:10
算出各自第一个的相位,用实部除虚部,然后就得到相位差了

可以详细说说吗,实部虚部怎么来的?
回复

使用道具 举报

0

主题

14

回帖

14

积分

新手上路

积分
14
发表于 2024-9-27 09:29:20 | 显示全部楼层
snakeemail 发表于 2024-9-26 20:49
这玩意是不是有专利?

我记得没错的话,是一篇天津大学的论文你可以看一下
回复

使用道具 举报

44

主题

242

回帖

374

积分

高级会员

积分
374
发表于 2025-6-14 19:22:22 | 显示全部楼层
awu 发表于 2024-9-27 09:29
我记得没错的话,是一篇天津大学的论文你可以看一下

我后来还是普通的dft,提高采样频率就解决了相位跳的问题。但是不知道为啥,算纯电阻的相位差是0. 但是实际为感抗,算出来是容抗。  
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 2025-6-14 21:31:59 | 显示全部楼层
goertzel了解一下
回复

使用道具 举报

44

主题

242

回帖

374

积分

高级会员

积分
374
发表于 2025-6-15 13:12:50 | 显示全部楼层

是识别电话按键声音的那个吗? DTMF tone。我按照deepseek给的代码在电脑上仿真算了下。幅度ok,但是相位不对
回复

使用道具 举报

0

主题

14

回帖

14

积分

新手上路

积分
14
发表于 2025-6-15 13:42:00 | 显示全部楼层
snakeemail 发表于 2025-6-15 13:12
是识别电话按键声音的那个吗? DTMF tone。我按照deepseek给的代码在电脑上仿真算了下。幅度ok,但是相位 ...

goertzel,就是DFT的算法啊,如果是仿真一定不会有问题。至于跳动,这个问题你的保证两次采样起始点一样或者过零点采样。
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 2025-6-15 17:46:53 | 显示全部楼层
snakeemail 发表于 2025-6-15 13:12
是识别电话按键声音的那个吗? DTMF tone。我按照deepseek给的代码在电脑上仿真算了下。幅度ok,但是相位 ...

怎么个不对法
回复

使用道具 举报

44

主题

242

回帖

374

积分

高级会员

积分
374
发表于 2025-6-16 18:33:42 | 显示全部楼层
本帖最后由 snakeemail 于 2025-6-16 18:36 编辑


我把相位改到90°,计算的相位phase: 359.686 degree

#include <math.h>#include <complex.h>#include <stdio.h>
void optimized_goertzel(double *x, int N, double k, double *magnitude, double *phase) {    double w = 2.0 * M_PI * k / N;    double cosine = cos(w);    double sine = sin(w);    double coeff = 2.0 * cosine;
    double q0, q1 = 0.0, q2 = 0.0;
    for (int n = 0; n < N; n++) {        q0 = coeff * q1 - q2 + x[n];        q2 = q1;        q1 = q0;    }
    // 直接计算实部和虚部    double real = q1 - q2 * cosine;    double imag = q2 * sine;
    *magnitude = sqrt(real*real + imag*imag);    *phase = atan2f(imag, real);    if (imag < 0 )    {        *phase = 360 + *phase;    }}
void test_goertzel() {
    // 示例信号参数    const int N = 1000;//200;      // 采样点数    const double fs = 1000; // 采样率(Hz)    const double target_freq = 50; // 目标频率(Hz)
    // 生成测试信号: 50Hz正弦波 + 少量噪声    double signal[N];    for (int i = 0; i < N; i++) {        double t = i / fs;        signal[i] = sin(2 * M_PI * 50 * t + (90 * M_PI / 180)); // + 0.1 * sin(2 * M_PI * 120 * t); //    }
    // 计算对应的DFT bin index    double k = (target_freq * N / fs); //50 * 1000 / 1000
    // 使用Goertzel算法计算    //double complex result = goertzel(signal, N, k);    double mag_peak = 0; // = compute_magnitude(result);    double phase = 0; // = compute_phase(result);
    optimized_goertzel(signal, N, k, &mag_peak, &phase);    // 输出结果    printf("目标频率: %.1f Hz\n", target_freq);    printf("对应DFT bin: %.2f\n", k);    //printf("复数结果: %.3f + %.3fi\n", creal(result), cimag(result));    printf("amp: %.3f\n", mag_peak / (N/2));    printf("phase: %.3f degree\n", phase);}

int main(void) //int argc, char *argv[]){    test_goertzel();
    return 0;}
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 2025-6-17 21:29:17 | 显示全部楼层
snakeemail 发表于 2025-6-16 18:33
我把相位改到90°,计算的相位phase: 359.686 degree

#include #include #include

你不是计算相位差吗,用改成计算两个信号相位差看看
回复

使用道具 举报

44

主题

242

回帖

374

积分

高级会员

积分
374
发表于 2025-6-19 17:58:09 | 显示全部楼层
庄永 发表于 2025-6-17 21:29
你不是计算相位差吗,用改成计算两个信号相位差看看

计算相位差我用DFT已经解决了。我现在想用goertzel算法加快计算速度,代码里面模拟了一个固定相位的波,但是goertzel相位算的不对,幅度倒是对的。估计我还是得去看算法原理
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 2025-6-19 21:40:59 | 显示全部楼层
snakeemail 发表于 2025-6-19 17:58
计算相位差我用DFT已经解决了。我现在想用goertzel算法加快计算速度,代码里面模拟了一个固定相位的波, ...

goertzel计算相位差应该也很准
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 16:21 , Processed in 0.049142 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表