沉默是今晚的唯一…… 2023-04-15 19:05 采纳率: 68.8%
浏览 18
已结题

C语言编程,随机信号

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

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-04-15 19:09
    关注

    基于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;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月2日
  • 已采纳回答 4月24日
  • 创建了问题 4月15日

悬赏问题

  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解