一.RGB文件三通道分量的熵计算
1.实验内容
任务:编程实现RGB文件三通道分量的熵计算
测试文件:分辨率为256*256,数据格式为每个像素占用三个字节,BGRBGR……保存,文件大小为196608字节。
2.实验思路
(1)将文件读入数组pix[196608]中
(2)将RGB三通道值分别保存在R[65536]G[65536]B[65536]三个数组中
(3)分别计算RGB三通道不同色度值的像素个数,进而得出频率值,即得到直方图
(4)分别计算RGB三通道熵,H=Σp(x)*log(1/p(x))
3.编程实现
#include<stdio.h>
#include<math.h>
#define N 256
unsigned char R[65536] = { 0 };
unsigned char G[65536] = { 0 };
unsigned char B[65536] = { 0 };
unsigned char pix[196608] = {0};
double rx[256] = { 0 };
double gx[256] = { 0 };
double bx[256] = { 0 };
void main()
{
float a;
float red = 0;
float green = 0;
float blue = 0;
FILE* test;
test = fopen("C://Users//DELL//Desktop//test.rgb","r");
if (test == NULL)
{
perror("FILE not open/n");
}
fread(pix,sizeof(unsigned char),196608,test);
for (int i = 0, j = 0; i < 196608; i = i + 3)
{
B[j] = pix[i];
G[j] = pix[i+1];
R[j] = pix[i+2];
j++;
}
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 65536; j++)
{
if (R[j] == i)
{
rx[i]++;
}
}
}
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 65536; j++)
{
if (G[j] == i)
{
gx[i]++;
}
}
}
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 65536; j++)
{
if (B[j] == i)
{
bx[i]++;
}
}
}
for (int i = 0; i < 256; i++)
{
rx[i] = rx[i] / 65536;
if (rx[i] != 0)
{
a = log(rx[i]) / log(2.0);
red = red - rx[i] * a;
}
gx[i] = gx[i] / 65536;
if (gx[i] != 0)
{
a = log(gx[i]) / log(2.0);
green = green - gx[i] * a;
}
bx[i] = bx[i] / 65536;
if (bx[i] != 0)
{
a = log(bx[i]) / log(2.0);
blue = blue - bx[i] * a;
}
}
fclose(test);
printf("R的熵为:%f\n", red);
printf("G的熵为:%f\n", green);
printf("B的熵为:%f\n",blue);
return;
}
运行结果:
二.元音时域波形和频谱特点
要求:录制三个元音音频,通过音频分析工具软件观察,总结时域波形、频谱的特点
时域波形:
只观察很短时间,我们可以看出,元音的时域波形具有周期性。元音或者辅音中的鼻音,浊擦音以及/l/,/r/等,都具有这种特征。而辅音中清擦音就没有周期性的特性。辅音中的爆破音,则往往表现为一小段静音加一个脉冲。
频谱:
频谱与时域波形一样,也有包络和精细结构。语音不是一个单独的频率,而是由许多频率的简谐振动叠加而成的。第一个峰叫基音,其余的峰叫泛音。