比较两个模拟信号的相似度

转载自微信公众号
原创 逸珺 嵌入式客栈

#include <stdio.h>
#include <math.h>

/* 返回值在区间: [-1,1]          */
/* 如返回-10,则证明输入参数无效    */
#define delta 0.0001f
double calculate_corss_correlation(double *s1, double *s2,int n)
{
    double sum_s12 = 0.0;
    double sum_s1  = 0.0;
    double sum_s2  = 0.0;
    double sum_s1s1 = 0.0; //s1^2
    double sum_s2s2 = 0.0; //s2^2
    double pxy = 0.0;
    double temp1 = 0.0;
    double temp2 = 0.0;
    
    if( s1==NULL || s2==NULL || n<=0)
      return -10;
    
    for(int i=0;i<n;i++)
    {
         sum_s12  += s1[i]*s2[i];
         sum_s1   += s1[i];
         sum_s2   += s2[i];
         sum_s1s1 += s1[i]*s1[i]; 
         sum_s2s2 += s2[i]*s2[i]; 
    }
    
    temp1 = n*sum_s1s1-sum_s1*sum_s1;
    temp2 = n*sum_s2s2-sum_s2*sum_s2;
    
    /* 分母不可为0 */
    if( (temp1>-delta && temp1<delta) || 
        (temp2>-delta && temp2<delta) ||
        (temp1*temp2<=0) )
    {
        return -10;  
    }       
    
    pxy = (n*sum_s12-sum_s1*sum_s2)/sqrt(temp1*temp2);
    
    return pxy;
}
double s1[30] = {
0.309016989,0.587785244,0.809016985,0.95105651,1,0.951056526,
0.809017016,0.587785287,0.30901704,5.35898E-08,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0
};
double s2[30] = {
0.343282816,0.686491368,0.874624132,0.99459642,1.008448609,
1.014252458,0.884609221,0.677632906,0.378334666,0.077878732,
0.050711886,0.066417083,0.088759401,0.005440732,0.04225661,
0.035349939,0.0631196,0.007566056,0.053183895,0.073143706,
0.080285063,0.030110227,0.044781145,0.01875573,0.08373928,
0.04550342,0.038880858,0.040611891,0.046116826,0.087670453
};

int main(void)
{
    double pxy;
    double s3[30];

    pxy = calculate_corss_correlation(s1,s2,30);
    printf("pxy of s1 and s2:%f\n",pxy);  
    
    pxy = calculate_corss_correlation(s1,s1,30);
    printf("pxy of s1 and s1:%f\n",pxy);  

    for(int i=0;i<n;i++)
    {
        s3[i] = -1*s1[i];
    }
    pxy = calculate_corss_correlation(s1,s3,30);
    printf("pxy of s1 and s3:%f\n",pxy);  
    
    return 0;
}
pxy of s1 and s2:0.997435
pxy of s1 and s1:1.000000
pxy of s1 and s1:-1.000000

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是使用Python绘制残差的相似度曲线的示例代码: ```python import numpy as np import matplotlib.pyplot as plt # 构造两个模拟数据,分别表示原始数据和重构数据 original_data = np.array([2, 4, 6, 8, 10]) reconstructed_data = np.array([1.8, 4.3, 5.5, 7.9, 9.8]) # 计算残差,并取绝对值 residuals = np.abs(original_data - reconstructed_data) # 计算相似度,采用余弦相似度 similarity = np.dot(original_data, reconstructed_data) / (np.linalg.norm(original_data) * np.linalg.norm(reconstructed_data)) # 绘制残差的相似度曲线 fig, ax1 = plt.subplots() color = 'tab:red' ax1.set_xlabel('Data points') ax1.set_ylabel('Residuals', color=color) ax1.plot(residuals, color=color) ax1.tick_params(axis='y', labelcolor=color) ax2 = ax1.twinx() color = 'tab:blue' ax2.set_ylabel('Similarity', color=color) ax2.plot(similarity, color=color) ax2.tick_params(axis='y', labelcolor=color) fig.tight_layout() plt.show() ``` 这段代码会生成一个包含残差的相似度曲线的图表,其中横轴表示数据点,纵轴左侧的红色线条表示残差,纵轴右侧的蓝色线条表示相似度。可以根据实际情况调整代码中的数据点和相似度计算方法。 ### 回答2: 要使用Python作出残差的相似度曲线,首先需要明确残差是指预测值与真实值之间的差异。下面是一个简单的Python代码示例,使用numpy、matplotlib库来实现: ```python import numpy as np import matplotlib.pyplot as plt # 定义真实值和预测值 true_values = np.array([1, 2, 3, 4, 5]) predicted_values = np.array([1.2, 1.8, 2.7, 3.5, 5.5]) # 计算残差 residuals = true_values - predicted_values # 计算相似度曲线 similarity_curve = 1 - np.abs(residuals) / true_values # 绘制相似度曲线 plt.plot(similarity_curve) plt.title("Similarity Curve of Residuals") plt.xlabel("Data Points") plt.ylabel("Similarity") plt.show() ``` 在这个代码示例中,我们设定了一组真实值和预测值,通过计算差异得到残差,然后根据残差计算相似度曲线。在相似度曲线中,y轴表示相似度的值,x轴表示不同的数据点。通过这个曲线,可以观察到预测值和真实值之间的相似度情况。 需要注意的是,这只是一个简单的示例,实际应用中可能需要考虑更多的因素和数据处理步骤,具体方法和结果会根据问题的具体要求和数据特征而有所不同。 ### 回答3: 残差的相似度曲线是指通过比较两个信号之间的残差来评估它们的相似度。在Python中,我们可以使用numpy和matplotlib这两个库来实现这个功能。 首先,我们需要导入所需的库: ```python import numpy as np import matplotlib.pyplot as plt ``` 接下来,我们可以定义两个信号的残差函数: ```python def compute_residual(signal1, signal2): residual = signal1 - signal2 return residual ``` 然后,我们可以生成两个信号并计算它们的残差: ```python # 生成信号 time = np.linspace(0, 10, 1000) signal1 = np.sin(time) signal2 = np.cos(time) # 计算残差 residual = compute_residual(signal1, signal2) ``` 最后,我们可以绘制残差的相似度曲线: ```python # 计算相似度 similarity = 1 - np.abs(residual) / np.max(np.abs(residual)) # 绘制曲线 plt.plot(time, similarity) plt.xlabel('Time') plt.ylabel('Similarity') plt.title('Residual Similarity Curve') plt.show() ``` 上述代码将生成一个相似度曲线,横轴表示时间,纵轴表示残差的相似度。该曲线可以帮助我们评估两个信号之间的相似程度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值