沉默是今晚的唯一…… 2023-04-15 19:05 采纳率: 70.6%
浏览 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日

悬赏问题

  • ¥15 我下载图形界面重启完就变成这样了,打字也打不了,动也动不了,该怎么解决(操作系统-centos)
  • ¥15 VBA中在窗体中遍历所有checkbox控件,提取出被选中的checkbox的caption值
  • ¥15 在Ubuntu上有什么命令,或者是系统文件能告诉我链接nvme ssd的pcie槽位是不是支持热插拔功能?
  • ¥15 ansys license许可证问题
  • ¥20 QQ号和密码都能正常登录微信 QQ号和密码登录微信显示密码错误
  • ¥15 qiankun主应用注册子应用提示跨域
  • ¥15 单片机RTOS Kernel与应用分离开发,Kernel如何调起应用?
  • ¥15 快手小店商家版APP怎么第三方APP跳转到指定用户聊天界面
  • ¥15 为什么AVL fire软件仿真时的步长改变了,仿真结果也会改变
  • ¥100 如何帮我写一个java小游戏