首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从.wav文件中剪切信号的振幅

从.wav文件中剪切信号的振幅
EN

Stack Overflow用户
提问于 2021-09-06 15:49:16
回答 1查看 74关注 0票数 0

我目前正在开发一个C程序,它打开一个.wav文件,复制输出文件中的.wav头文件,并在头文件之后添加从输入文件获得的处理后的数据。该过程包括将每个样本乘以0.5,以降低信号的幅度。下面是我的代码:

program.c

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

struct header_file
{
    char chunk_id[4];
    int chunk_size;
    char format[4];
    char subchunk1_id[4];
    int subchunk1_size;
    short int audio_format;
    short int num_channels;
    int sample_rate;        
    int byte_rate;
    short int block_align;
    short int bits_per_sample;
    char subchunk2_id[4];
    int subchunk2_size;
};

struct header_file header;

int main()

{
    
    FILE * inputfile = fopen("maneskin.wav","rb");      // deschidere fisier .wav, modul de citire
    FILE * outputfile = fopen("Output.wav","wb");       // creeaza fisierul .wav, modul de scriere

    int BUFFSIZE = 10000;                   // lungimea buffer-ului
    int count = 0;                      // numara cate frame-uri sunt in fisier
    short int inputBuffer[BUFFSIZE];
    short int outputBuffer[BUFFSIZE];           
/*  header_p meta = (header_p)malloc(sizeof(header));    */
    int nb;                         // numarul de bytes returnati
    int temp;

    if (inputfile)
    {
        
        fread(&header, sizeof(header),1, inputfile);
        fwrite(&header,sizeof(header),1, outputfile);
        
        short int ch2[BUFFSIZE];
         for(int i=0; i<BUFFSIZE; i++)                                           \
            ch2[i] = 1;  
    
        while (!feof(inputfile))//cat timp se citeste fisierul 
        {
             for(int i=0; i<BUFFSIZE && !feof(inputfile); i++) 
            fread((char*)&inputBuffer[i],sizeof(short int),1, inputfile);       // citirea datelor
            count++;// incrementarea numarului de frame-uri
                 for(int z=0; z<BUFFSIZE; z++){
                    outputBuffer[z]=0.5*inputBuffer[z];
                    }   
             for(int k=0; k<BUFFSIZE; k++)
             {

                fwrite((char*)&outputBuffer[k], sizeof(short int), 1, outputfile);// scriere in fisier
                
                 }
            
            
        }
    printf("Numarul de cadre din fisierul wav:%d\n", count);
    }
return 0;
}

我遇到的问题是,当我试图用VLC或任何其他媒体播放器打开输出文件时,它不能打开,并给我一个错误。我认为这可能是输出文件中的头写入的问题,但我不确定。我尝试在Audacity中将文件作为原始数据导入,并播放音频文件,但如果我尝试将其导入为wav文件,则work.What不会出现问题吗?

EN

回答 1

Stack Overflow用户

发布于 2021-09-06 16:03:07

我不知道这是不是你唯一的问题,但这绝对是个问题...在C语言中,通常当你定义一个结构时,该结构的成员在内存中并不是紧挨着的。编译器将它们安排在适合处理器的边界上,通常是以处理器的字长递增。因此,由两个it包围的char类型的元素并不是恰好位于它们之间,而是在它和下一个元素之间实际上有大约7字节的空间。

这样做是为了提高执行效率,而且通常是有意义的。

但在这种情况下,您希望将结构元素紧密地打包在一起,为此,有一种标准方法可以告诉编译器这就是您想要的:

代码语言:javascript
复制
/* pack in 1 byte increments */
#pragma pack(1)

struct header_file
{
    char chunk_id[4];
    int chunk_size;
    char format[4];
    char subchunk1_id[4];
    int subchunk1_size;
    short int audio_format;
    short int num_channels;
    int sample_rate;        
    int byte_rate;
    short int block_align;
    short int bits_per_sample;
    char subchunk2_id[4];
    int subchunk2_size;
};

/* reset to default */
#pragma pack()

我还建议使用特定于大小的类型,例如uint16_t而不是short int,因为您不知道在可能编译代码的每个平台上int的大小。

在您的代码中,尝试打印sizeof标头,看看它是否是您所期望的,例如:

代码语言:javascript
复制
printf("sizeof(header)=%d\n", sizeof(header));

如果数字与WAV报头的应有值不匹配,则说明一个或多个元素的大小有问题,或者包装有问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69077301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档