一、元音时域和频域波形分析
录制三个元音a、o、e,分析时域和频域波形:
1.时域分析
未放大时域波形:
放大时域波形:
可以看出其具有规律的周期性
2.频域分析
3.语谱图
可清晰看到三个元音的共振峰。
二、RGB文件三通道熵的计算
该部分使用测试文件test.rgb,分辨率为256*256,数据格式为每个像素占用3字节,BGRBGR...保存。
1.熵的计算原理
先分别计算出R、G、B三个通道0-255各值的概率,再计算通道的熵。
2.代码实现
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
int main()
{
//打开,创建文件
FILE *fp=fopen("D:\\大三\\大三下\\数据压缩\\test.rgb","rb");
FILE *fp_r=fopen("D:\\大三\\大三下\\数据压缩\\r.txt","w");
FILE *fp_g=fopen("D:\\大三\\大三下\\数据压缩\\g.txt","w");
FILE *fp_b=fopen("D:\\大三\\大三下\\数据压缩\\b.txt","w");
double h = 256;//高为256
double w = 256;//宽为256
//定义R、G、B分量
unsigned char* r;
r = new unsigned char[256 * 256];
unsigned char* g;
g = new unsigned char[256 * 256];
unsigned char* b;
b = new unsigned char[256 * 256];
unsigned char* image;
image = new unsigned char[256 * 256 * 3];
//定义频率分量
double R_F[256] = {0} , G_F[256] = {0} , B_F[256] = {0};
//定义熵
double R_S = 0 , G_S = 0 , B_S = 0;
//读取R、G、B三个分量到数组中
fread(image,sizeof(unsigned char), 256*256*3, fp);
for (int i = 0, j = 0; i < 256*256*3; i = i + 3, j++)
{
b[j] = image[i];
g[j] = image[i+1];
r[j] = image[i+2];
}
//计数三通道各颜色值次数
for (int i = 0; i < 256; i++)
{
for (int j = 0; j <h*w ; j++)
{
if (int(r[j] == i)) {R_F[i]++;}
if (int(g[j] == i)) {G_F[i]++;}
if (int(b[j] == i)) {B_F[i]++;}
}
}
//计算频率
for (int i = 0; i < 256; i++)
{
R_F[i] = R_F[i] /double (256 * 256);
B_F[i] = B_F[i] /double (256 * 256);
G_F[i] = G_F[i] /double (256 * 256);
}
//计算并输出熵
for (int i = 0; i < 256; i++)
{
if (R_F[i] != 0) {R_S += -R_F[i] * log(R_F[i]) / log(2.0);}
if (G_F[i] != 0) {G_S += -G_F[i] * log(G_F[i]) / log(2.0);}
if (B_F[i] != 0) {B_S += -B_F[i] * log(B_F[i]) / log(2.0);}
}
cout << "R的熵为" << R_S << endl;
cout << "G的熵为" << G_S << endl;
cout << "B的熵为" << B_S << endl;
fclose(fp);
fclose(fp_r);
fclose(fp_g);
fclose(fp_b);
return 0;
}