// wavcpp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<conio.h>
#include<string.h>
#include <stdlib.h>
#include <windows.h>
#include<math.h>
#include<graphics.h>
#include "wav.h"
#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib")
#define WAVE_FILE_HEADER_SIZE sizeof(wave_header_t)
static char wav_header[WAVE_FILE_HEADER_SIZE];
long total_size = 0;
wave_file_t wave_file_info;
# define PI 3.14 //根据运算精度或要求自行截取位数
#define q 8
#define N (1<<q) /*2的q次方点数 */
#define Fs 2560 //采样率 Fs > 2fh
typedef float real;
typedef struct
{
real Re;
real Im;
}complex;
static void Asm_Mag(complex* x, int n)
{
initgraph(10000, 300); // 创建绘图窗口
setbkcolor(WHITE); // 设置背景色为白色
cleardevice();
int duan = 0;
for (int i = 0; i < n; i++)
{
real Mag;
Mag = sqrt(x[i].Re * x[i].Re + x[i].Im * x[i].Im) / N;
setcolor(RED);//设置绘图的颜色
line(i-duan*10000, 0, i-duan*10000, Mag);//画线
if (i > 10000)
{
duan++;
cleardevice();
_getch();
}
}
_getch();
closegraph();
}
void fft(complex* v, int n, complex* tmp)
{
if (n > 1)
{
int k, m; complex z, w, *vo, *ve;
ve = tmp; vo = tmp + n / 2;
for (k = 0; k < n / 2; k++) {
ve[k] = v[2 * k];
vo[k] = v[2 * k + 1];
}
fft(ve, n / 2, v); /* FFT 偶序列 */
fft(vo, n / 2, v); /* FFT 奇序列*/
for (m = 0; m < n / 2; m++) {
w.Re = cos(2 * PI * m / (double)n);
w.Im = -sin(2 * PI * m / (double)n);
z.Re = w.Re * vo[m].Re - w.Im * vo[m].Im;
z.Im = w.Re * vo[m].Im + w.Im * vo[m].Re;
v[m].Re = ve[m].Re + z.Re;
v[m].Im = ve[m].Im + z.Im;
v[m + n / 2].Re = ve[m].Re - z.Re;
v[m + n / 2].Im = ve[m].Im - z.Im;
}
}
return;
}
void wavheader(char *file_in_path, char *merger_data_path, char *save_path)
{
FILE *file_in;//源文件指针
FILE *merger_file;//合并后的指针
FILE *save_file;
long file_in_size = 0;//源文件字节数
//打开文件
file_in = fopen(file_in_path, "rb");
merger_file = fopen(merger_data_path, "rb");
save_file = fopen(save_path, "wb");
//printf("%ld\n",file_in_size);
uint8_t *buf_head;
for (int i = 0; i < WAVE_FILE_HEADER_SIZE - 4; i++)
{
fread(&buf_head, 1, 1, file_in);//获取文件头信息
fwrite(&buf_head, 1, 1, save_file);//把文件头写入合并文件
}
uint8_t buf_length[4];
buf_length[0] = total_size / (255 * 255 * 255);
buf_length[1] = total_size % (255 * 255 * 255) / (255 * 255);
buf_length[2] = total_size % (255 * 255) / 255;
buf_length[3] = total_size % 255;
//printf("%c %c %c %c",buf_length[0],buf_length[1],buf_length[2],buf_length[3]);
fwrite(&buf_length[3], 1, 1, save_file);
fwrite(&buf_length[2], 1, 1, save_file);
fwrite(&buf_length[1], 1, 1, save_file);
fwrite(&buf_length[0], 1, 1, save_file);
uint8_t *buf_data;
for (int i = 0; i < total_size; i++)
{
fread(&buf_data, 1, 1, merger_file);//获取文件头信息
fwrite(&buf_data, 1, 1, save_file);//把文件头写入合并文件
}
//读取后关闭文件
fclose(file_in);
fclose(merger_file);
fclose(save_file);
}
void mergerwavdata(char *file_in_path, char *merger_file_path) //合并数据
{
FILE *file_in;//源文件指针
FILE *merger_file;//合并后的指针
long file_in_size = 0;//源文件字节数
//打开文件
file_in = fopen(file_in_path, "rb");
merger_file = fopen(merger_file_path, "ab");
//获取源文件字节数
fseek(file_in, 0L, SEEK_END);
file_in_size = ftell(file_in);
total_size += file_in_size - WAVE_FILE_HEADER_SIZE;
uint8_t *buf;
fseek(file_in, 0L, SEEK_SET);//指针移至 开头
for (int i = 0; i < 44; i++)
fread(&buf, 1, 1, file_in);//跳过44字节头数据
//printf("%ld\n",file_in_size);
uint8_t *buf_data;
for (int i = 0; i < file_in_size - 44; i++)
{
fread(&buf_data, 1, 1, file_in);//获取音频数据
//printf("%d ",*buf_data);
fwrite(&buf_data, 1, 1, merger_file);//把数据写入合并文件
}
//读取后关闭文件
fclose(file_in);
fclose(merger_file);
}
void set_wav_speed(char *file_in_path, long set_speed)//设置播放速度
{
FILE *file_in;//源文件指针
FILE *save_file;
long all_size;
//打开文件
file_in = fopen(file_in_path, "rb");
save_file = fopen("set.wav", "wb");
//获取源文件字节数
fseek(file_in, 0L, SEEK_END);
all_size = ftell(file_in);
fseek(file_in, 0L, SEEK_SET);//指针移至 开头
//printf("%ld\n",file_in_size);
uint8_t *buf_head;
for (int i = 0; i < 24; i++)
{
fread(&buf_head, 1, 1, file_in);//获取文件头信息
fwrite(&buf_head, 1, 1, save_file);//把文件头写入合并文件
}
uint8_t buf_length[4];
buf_length[0] = set_speed / (255 * 255 * 255);
buf_length[1] = set_speed % (255 * 255 * 255) / (255 * 255);
buf_length[2] = set_speed % (255 * 255) / 255;
buf_length[3] = set_speed % 255;
//printf("%c %c %c %c",buf_length[0],buf_length[1],buf_length[2],buf_length[3]);
fwrite(&buf_length[3], 1, 1, save_file);
fwrite(&buf_length[2], 1, 1, save_file);
fwrite(&buf_length[1], 1, 1, save_file);
fwrite(&buf_length[0], 1, 1, save_file);
for (int i = 0; i < 4; i++)
fread(&buf_head, 1, 1, file_in);//获取文件头信息
for (int i = 0; i < 16; i++)
{
fread(&buf_head, 1, 1, file_in);//获取文件头信息
fwrite(&buf_head, 1, 1, save_file);//把文件头写入合并文件
}
uint8_t *buf_data;
for (int i = 0; i < all_size - 44; i++)
{
fread(&buf_data, 1, 1, file_in);//获取文件头信息
fwrite(&buf_data, 1, 1, save_file);//把文件头写入合并文件
}
fclose(file_in);
fclose(save_file);
mciSendString(TEXT("open set.wav"), NULL, 0, NULL);
//mciSendString(TEXT(str), NULL, 0, NULL);
mciSendString(TEXT("play set.wav wait"), NULL, 0, NULL);
mciSendString(TEXT("close set.wav"), NULL, 0, NULL);
remove("set.wav");
//读取后关闭文件
}
void feature_analysis(char *file_in_path)//音频最大值、最小值、平均值
{
int max = 0, min = 255;
float ave = 0;
long sum = 0;
FILE *file_in;//源文件指针
long file_in_size = 0;//源文件字节数
//打开文件
file_in = fopen(file_in_path, "rb");
//获取源文件字节数
fseek(file_in, 0L, SEEK_END);
file_in_size = ftell(file_in);
uint8_t *buf_flag;
fseek(file_in, 0L, SEEK_SET);//指针移至 开头
for (int i = 0; i < 44; i++)
fread(&buf_flag, 1, 1, file_in);//跳过44字节头数据
//printf("%ld\n",file_in_size);
uint8_t buf_data;
for (int i = 0; i < file_in_size - 44; i++)
{
fread(&buf_data, 1, 1, file_in);//获取音频数据
sum += buf_data - '\0';
if (min > buf_data - '\0')//
min = buf_data - '\0';
if (max < buf_data - '\0')
max = buf_data - '\0';
//printf("%d ",buf_data-'\0');
}
//printf("%d ",buf_data);
//读取后关闭文件
fclose(file_in);
ave = sum / (file_in_size - WAVE_FILE_HEADER_SIZE);
printf("音频%s:\n最大值:%d,最小值:%d ,平均值:%f\n", file_in_path, max, min, ave);
}
void time_img(char *file_in_path)
{
FILE *file_in;//源文件指针
long file_in_size = 0;//源文件字节数
//打开文件
file_in = fopen(file_in_path, "rb");
//获取源文件字节数
fseek(file_in, 0L, SEEK_END);
file_in_size = ftell(file_in);
uint8_t *buf_flag;
fseek(file_in, 0L, SEEK_SET);//指针移至 开头
for (int i = 0; i < 44; i++)
fread(&buf_flag, 1, 1, file_in);//跳过44字节头数据
//printf("%ld\n",file_in_size);
uint8_t buf_data;
initgraph(10000, 300); // 创建绘图窗口
setbkcolor(WHITE); // 设置背景色为白色
cleardevice();
int piontx[2] = { 0 };
int pionty[2] = { 0 }
没有合适的资源?快使用搜索试试~ 我知道了~
WAV格式音频分析系统整包项目文件
共43个文件
tlog:12个
wav:6个
pdb:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 92 浏览量
2022-07-01
12:33:44
上传
评论
收藏 27.47MB ZIP 举报
温馨提示
1.编译工具VS2017,如你安装的是高版本的VS,请新建同名C++控制台应用,然后复制资源文件替换新建代码文件 2.提前安装graphics绘图库 3.主要实现了:音频合成,设置频率播放,绘制音频时域图和频域图,等
资源推荐
资源详情
资源评论
收起资源包目录
wavcpp.zip (43个子文件)
wavcpp
.vs
wavcpp
v15
Browse.VC.db 35.45MB
.suo 39KB
ipch
AutoPCH
e56b126c07a83370
WAVCPP.ipch 42.19MB
wavcpp
1.wav 1.61MB
4.wav 6.36MB
1234.wav 2.9MB
3.wav 570KB
2.wav 1.29MB
wavcpp.vcxproj 8KB
wav.h 868B
x64
Debug
wavcpp.tlog
CL.write.1.tlog 436B
CL.read.1.tlog 21KB
wavcpp.lastbuildstate 201B
CL.command.1.tlog 682B
link.write.1.tlog 418B
link.command.1.tlog 1KB
link.read.1.tlog 3KB
wavcpp.log 2KB
wavcpp.obj 69KB
vc141.idb 243KB
vc141.pdb 132KB
12.wav 2.9MB
wavcpp.vcxproj.user 165B
wavcpp.vcxproj.filters 1KB
Debug
wavcpp.tlog
CL.write.1.tlog 412B
CL.read.1.tlog 21KB
wavcpp.lastbuildstate 203B
CL.command.1.tlog 714B
link.write.1.tlog 386B
link.command.1.tlog 1KB
link.read.1.tlog 3KB
wavcpp.log 2KB
wavcpp.obj 63KB
vc141.idb 251KB
vc141.pdb 148KB
wavcpp.cpp 13KB
x64
Debug
wavcpp.exe 162KB
wavcpp.ilk 969KB
wavcpp.pdb 700KB
Debug
wavcpp.exe 122KB
wavcpp.ilk 1.05MB
wavcpp.pdb 988KB
wavcpp.sln 1KB
共 43 条
- 1
资源评论
栋梁程序开发工作室
- 粉丝: 21
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功