生成两个相同长度的随机信号,分别计算两个信号间的均方误差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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: