【数据压缩】第一周作业及实验一——浊音、清音、爆破音频谱分析与RGB文件熵计算

第一周作业——浊音、清音、爆破音频谱分析与RGB文件熵计算

1.1 查看浊音、清音、爆破音的时域波形及分析其频域特性

使用Audacity分析浊音、清音以及爆破音的时域及频域特性分析

  1. 浊音“a”
    1)时域
    浊音时域波形比较规律,具有短时周期性,过零点不明显;
    在这里插入图片描述2)频域
    能量集中在低频,存在明显的共振峰,峰值在300Hz左右。
    在这里插入图片描述

  2. 浊音“o”
    1)时域
    在这里插入图片描述 2)频域
    在这里插入图片描述

  3. 浊音“e”
    1)时域
    在这里插入图片描述

    2)频域
    在这里插入图片描述浊音“a\o\e”的时域与频域特性都十分相似

  4. 清音“s”
    1)时域
    波形较为均匀,幅度变化也比浊音小,波形频率高,过零点不清晰,短时过零率最大。在这里插入图片描述2)频域
    能量分布较为平均,能量最大值位于2000Hz附近在这里插入图片描述

  5. 爆破音“p”
    1)时域
    波形一开始非常集中,变换的频率很高,中后部分的波形呈现非常有规律的“缓波”形在这里插入图片描述2)频域
    能量集中在低频部分,短时过零率比浊音大,比清音小,波形抖动幅度最大,能量从低频向2000Hz急剧递减在这里插入图片描述

1.2 RGB文件熵计算

1.实验目的
对RGB文件进行分析,计算三个通道(BGR BGR BGR)各自的熵。

2.代码思路
1)读入一个RGB文件,创建3个空文件
2)创建3个数组,将R、G、B各分量数据从RGB文件中读出,并保存到3个数组中
3)统计RGB的出现次数,计算概率分布
4)将值分别读入RGB个空文件中
5)计算熵
3.代码

#include <iostream>  
#include <stdio.h>  
#include <stdlib.h>  
using namespace std;  
const int Size = 256 * 256;//图像大小  
int main()  
{  
     //打开RGB并存入sum,创建三个空文件  
     FILE* image, * red, * green,*blue;   
     fopen_s(&image, "...\\test.rgb", "rb");  
     fopen_s(&red, "...\\Red.txt", "w");  
     fopen_s(&green, "...\\Green.txt", "w");  
     fopen_s(&blue, "...\\Blue.txt", "w");  
     
     unsigned char sum[256*256*3];  
     fread(sum, 1, 256*256*3, image);  
  
     //定义存放R、G、B分量的数组
     unsigned char R[size] = { 0 };
     unsigned char G[size] = { 0 };
     unsigned char B[size] = { 0 };  
     //定义频率分量  
     double R_F[256] = { 0 };
     double G_F[256] = { 0 };
     double B_F[256] = { 0 };  
     //定义熵  
     double R_S = 0,G_S = 0, B_S = 0;  
  
  	//分别读取R、G、B三个分量到数组中
     for (int i = 0, j = 0; i < 256*256*3; i = i + 3, j++)  
     {  
          B[j] = *(sum + i);  
          G[j] = *(sum + i + 1);  
          R[j] = *(sum + i + 2);   
     }  
  
     //统计每个颜色值i出现的次数F
     for (int i = 0; i < 256; i++)  //分量取值i范围0~255
     {  
          for (int j = 0; j < size; 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]++;  
          }  
     }  
  
    //计算每个色彩值i的频率F 
     for (int i = 0; i < 256; i++) 
     {  
          R_F[i] = R_F[i] / (256 * 256);  
          B_F[i] = B_F[i] / (256 * 256);  
          G_F[i] = G_F[i] / (256 * 256);  
     }  
  
     //将频率写入文件  
     fprintf(red, "值\t概率\n");  
     for (int i = 0; i < 256; i++)  
        fprintf(red, "%d\t%f\n", i, R_F[i]);  
  
     fprintf(green, "值\t概率\n");  
     for (int i = 0; i < 256; i++)  
         fprintf(green, "%d\t%f\n", i, G_F[i]);  
  
     fprintf(blue, "值\t概率\n");  
     for (int i = 0; i < 256; i++)  
         fprintf(blue, "%d\t%f\n", i, B_F[i]);  
  
     //计算并输出熵S
     for (int i = 0; i < 256; i++)  
     {  
          if (R_F[i] != 0)   
              R_S += -R_F[i] * log(R_F[i]) / log(double(2));  
          if (G_F[i] != 0)   
              G_S += -G_F[i] * log(G_F[i]) / log(double(2));  
          if (B_F[i] != 0)  
              B_S += -B_F[i] * log(B_F[i]) / log(double(2));  
     }  
  
     cout << "R熵为" << R_S << endl;  
     cout << "G熵为" << G_S << endl;  
     cout << "B熵为" << B_S << endl;  
  
     fclose(image);  
     fclose(red);  
     fclose(green);  
     fclose(blue);  
     return 0;  
} 


运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值