C语言编程,随机信号

生成两个相同长度的随机信号,分别计算两个信号间的均方误差MSE,相关系数及峰值信噪比PSNR。(提高部分:考虑两个随机信号的相关性,或通过加高斯白噪声的方式生成纯净信号和带噪信号,了解信号增强的评价准则)
实验提示:自己通过图书馆、网络等资源查找 MSE及PSNR的计算公式:自学利用MATLAB或C语言生成两个随机信号序列,并计算得到二者的 MSE和PSNR 取值。

基于Monster 组和GPT的调写:
用rand()函数生成随机数,并将其存储到两个数组中。程序使用了数学库中的sqrt()函数和pow()函数,分别用于计算平方根和幂。

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

#define N 1000  // 信号长度
#define MAX_AMPLITUDE 1000  // 最大振幅

// 生成随机信号
void generate_signal(double *signal)
{
    for (int i = 0; i < N; i++) {
        signal[i] = ((double)rand() / RAND_MAX) * MAX_AMPLITUDE;
    }
}

// 计算两个信号的均方误差MSE
double calculate_mse(double *signal1, double *signal2)
{
    double sum = 0;
    for (int i = 0; i < N; i++) {
        sum += pow(signal1[i] - signal2[i], 2);
    }
    return sum / N;
}

// 计算两个信号的相关系数
double calculate_correlation(double *signal1, double *signal2)
{
    double sum1 = 0, sum2 = 0, sum3 = 0;
    for (int i = 0; i < N; i++) {
        sum1 += signal1[i];
        sum2 += signal2[i];
        sum3 += signal1[i] * signal2[i];
    }
    double mean1 = sum1 / N;
    double mean2 = sum2 / N;
    double cov = sum3 / N - mean1 * mean2;
    double var1 = 0, var2 = 0;
    for (int i = 0; i < N; i++) {
        var1 += pow(signal1[i] - mean1, 2);
        var2 += pow(signal2[i] - mean2, 2);
    }
    var1 /= N;
    var2 /= N;
    double std1 = sqrt(var1);
    double std2 = sqrt(var2);
    return cov / (std1 * std2);
}

// 计算两个信号的峰值信噪比PSNR
double calculate_psnr(double *signal1, double *signal2)
{
    double mse = calculate_mse(signal1, signal2);
    double max_amplitude = 0;
    for (int i = 0; i < N; i++) {
        if (signal1[i] > max_amplitude) {
            max_amplitude = signal1[i];
        }
    }
    return 10 * log10(pow(max_amplitude, 2) / mse);
}

int main()
{
    double signal1[N], signal2[N];
    srand(12345);  // 设置随机数种子,保证每次运行结果一致
    generate_signal(signal1);
    generate_signal(signal2);
    double mse = calculate_mse(signal1, signal2);
    double correlation = calculate_correlation(signal1, signal2);
    double psnr = calculate_psnr(signal1, signal2);
    printf("MSE: %.2f\n", mse);
    printf("Correlation: %.2f %%\n", correlation * 100);
    printf("PSNR: %.2f dB\n", psnr);
    return 0;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^