Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/55: Рейтинг темы: голосов - 55, средняя оценка - 5.00
84 / 4 / 0
Регистрация: 01.02.2012
Сообщений: 93

Считывание массива семплов из WAV

21.06.2015, 01:27. Показов 12419. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Такая проблема. Считывается заголовок. Когда пытаюсь считать поле data в массив, чтобы получить значения амплитуд звука получаю segmentation fault. Не могли бы вы написать, как считать сами значения? (в матлабе считывает все стандартная функция и такой проблемы нет)

Пример брала отсюда http://audiocoding.ru/article/... cture.html

Мой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <math.h>
 
using namespace std;
 
struct  WAV_HEADER{
        char                RIFF[4];        // RIFF Header      Magic header
        unsigned long       ChunkSize;      // RIFF Chunk Size
        char                WAVE[4];        // WAVE Header
        char                fmt[4];         // FMT header
        unsigned long       Subchunk1Size;  // Size of the fmt chunk
        unsigned short      AudioFormat;    // Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
        unsigned short      NumOfChan;      // Number of channels 1=Mono 2=Sterio
        unsigned long       SamplesPerSec;  // Sampling Frequency in Hz
        unsigned long       bytesPerSec;    // bytes per second
        unsigned short      blockAlign;     // 2=16-bit mono, 4=16-bit stereo
        unsigned short      bitsPerSample;  // Number of bits per sample
        char                Subchunk2ID[4]; // "data"  string
        unsigned long       Subchunk2Size;  // Sampled data length
 
    //std::vector<long double> data;
    std::vector<char*> data;
    };
 
struct WAV_DATA{
 
    std::vector<long> data;
};
 
int main()
{
 
        WAV_HEADER wavHeader;
    WAV_DATA wavData;
        FILE *wavFile;
    int i=0;
 
    //wavData.data.reserve(255);
    wavHeader.data.reserve(255);
 
        long headerSize = sizeof(wavHeader), filelength = 0;
 
     wavFile = fopen ("pilotag_wav.wav", "rb");
 
     if (wavFile!=NULL)
      {
        cout << "File Open\n"; 
      } 
      else 
      {
         cout << "File no open\n"; 
      };
      
        fread(&wavHeader,headerSize,1,wavFile);
    unsigned long size = labs(wavHeader.Subchunk2Size); 
    
    printf("Number of channel = %d\n", wavHeader.NumOfChan);
    printf("Sampling Frequency = %ld\n", wavHeader.SamplesPerSec);
    printf("bits per sec = %d\n", wavHeader.bitsPerSample);
        printf("Sampled data length = %ld\n", labs(wavHeader.Subchunk2Size));
 
    
    //fread(&wavData,8,size,wavFile);  // segmfault?
        //char *pData = new char[size+1]; 
 
    //printf(" %s\n", wavHeader.data[0]);
 
    for(int i=0; i<size; i++)
    {
        cout << i<<"= " << wavHeader.data[i] << endl;
    }
 
 
        //fclose(wavFile); 
      
    return 0;
}
Добавлено через 1 час 46 минут
И как проверить там ли записываются данные заголовка, а то при выводе в консоль после RIFF идет адракадабра из символов?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2015, 01:27
Ответы с готовыми решениями:

Считывание и запись Wav
Здравствуйте, подскажите, почему с таким кодом файл не остается таким же, а уменьшается размером и длительностью звучания? using...

Считывание заголовка wav файлов
Есть код: #include &lt;stdio.h&gt; #include &lt;tchar.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; // Структура, описывающая заголовок...

Считывание .wav + изменение частоты дискредитации
Здравствуйте. Возникла проблема с работой функции decimate и interp, хотя Signal Processing Toolbox установлен. Необходимо провести...

52
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
01.07.2015, 13:43
Студворк — интернет-сервис помощи студентам
А я тупо поделил и получил полное совпадение с данными из matlab
1
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,468
01.07.2015, 15:26
Цитата Сообщение от Croessmah Посмотреть сообщение
А я тупо поделил
интересно как вам это удалось. к примеру первое значение в файле равно 65491. делим на 0x8000 (если у вас другое значение поправьте меня) и получаем в любом случае положительное число в то время как matlab дает -0.00137.

Добавлено через 7 минут
...если интерпретировать значения как знаковые целые 16 бит, то да, выходит. однако, мы видим, что с физической точки зрения это странно. или может я думаю что это странно

Добавлено через 3 минуты
...да, пожалуй в этом и есть причина. данные - это знаковые целые. этого достаточно:
C++
1
double x = (double)(__int16)value[i] / 0x8000;
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
01.07.2015, 15:56
Наложение звукового эффекта на wav файл
1
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,468
01.07.2015, 17:13
ну да, как всегда забыли про овраги и открыли заново дополнение до 2)
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
01.07.2015, 17:30
Цитата Сообщение от vxg Посмотреть сообщение
ну да, как всегда забыли про овраги и открыли заново дополнение до 2)
ну так эврика же я когда-то волновой алгоритм изобрел... да, у меня не было Интернета тогда
0
84 / 4 / 0
Регистрация: 01.02.2012
Сообщений: 93
01.07.2015, 23:31  [ТС]
vxg,

Добавлено через 5 минут
vxg,

Вот мне Croessmah, дал пример, который выводит правильные значения, но проблема в том, что он не работает под unix и я бы хотела избежать потоков и классов на данном этапе впринципе. Я не могу понять, почему в этом случае в data пишутся значения вида 008A54F0 и потом они преобразуются в нужные мне -0.001373291015625 простым преобразованием типа, а у меня в массив пишутся числа от 0 до 65000 вместо от -32000 до 32000.
Как в моем случае можно избавится от потока читать в массивы не используя STREAM?

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#include "stdafx.h"
#include <iomanip> 
#include <stdint.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
//#include <bitset>
 
 
//TODO: Проверить очистку памяти
 
 
class Chunk {
public:
 
    typedef std::vector<char> STREAM ;
    //Из строки в int
    static unsigned int inline getIDByName ( const char * nameString ) {
        return * reinterpret_cast < const unsigned int * > ( nameString ) ;
    }
 
    //Из int в строку
    static std::string inline getNameByID ( unsigned int value ) {
        char * pNow = reinterpret_cast < char * > ( &value ) ;
        return std::string ( pNow , pNow + sizeof ( value ) ) ;
    }
 
    //Конструкторы
    Chunk () : data ( 0 , 0 , STREAM() ) {}
 
    Chunk ( int nameID , int size , const STREAM & dataStream ) : data(nameID,size,dataStream) {
    }
 
    std::string inline get_name ( ) const {
        return getNameByID ( data.name ) ;
    }
 
    unsigned int inline get_nameID ( ) const {
        return data.name ;
    }
    unsigned int inline get_size ( ) const {
        return data.size ;
    }
    void set_nameID ( unsigned int value ) {
        data.name = value ;
    }
    void set_size ( unsigned int value ) {
        data.size = value ;
        data.data.resize ( value ) ;
    }
    void set_stream ( const STREAM & value ) {
        data.data = value ;
        data.size = value.size ( ) ;
    }
    STREAM  get_data ( ) {
        return data.data ;
    }
 
private:
    struct chunk {
        unsigned int name ;
        unsigned int size ;
        STREAM data ;
        chunk ( int name_ , int size_ , const STREAM & data_ ) : name(name_), size(size_),data (data_) {
        }
    } ;
    chunk data ;
} ;
 
 
class WaveFile {
 
private:
    Chunk RIFF ;
    unsigned int RIFFTYPE ;
    struct fmt{
        unsigned short audioFormat ; //Если значение не равно 1 , значит используется какое-то сжатие. PCM == 1
        unsigned short numChannels ; //Количество каналов
        unsigned int sampleRate ; //Частота дискретизации
        unsigned int byteRate ; //Количество байт переданных за секунду воспроизведения
        unsigned short blockAlign ; //Количество байт для одного сэмпла, включая все каналы
        unsigned short bitsPerSample ; //Количество бит в сэмпле. Глубина звучания.
        unsigned short extraFmtBytes ; //Количество дополнительных байт
    };
    std::vector < Chunk > collection ;
 
public:
 
    //Конструктор, создание Wav файла
    WaveFile ( const std::string & filePath ) {
        std::ifstream iFile ( filePath, std::ios_base::binary ) ;
        unsigned int temp_riffNameId ;
        unsigned int temp_riffSize ;
 
        //RIFF
        iFile.read ( reinterpret_cast < char * > ( & temp_riffNameId ) , sizeof(temp_riffNameId ) );
        //Проверка на соответствие RIFF
        if(RIFF.getNameByID(temp_riffNameId) != "RIFF"){
            throw std::string("Error. Not RIFF");
        }
 
        //Размер
        iFile.read ( reinterpret_cast < char * > ( & temp_riffSize ) , sizeof(temp_riffSize ) );
 
        RIFF.set_nameID ( temp_riffNameId ) ;
        RIFF.set_size ( temp_riffSize ) ;
 
        iFile.read ( reinterpret_cast < char * > ( & RIFFTYPE ) , sizeof( RIFFTYPE ) );
        //Проверка на соответствие WAVE
        if(RIFF.getNameByID(RIFFTYPE) != "WAVE"){
            throw std::string("Error. Not WAVE");
        }
 
        while ( iFile.read ( reinterpret_cast < char * > ( & temp_riffNameId ) , sizeof(temp_riffNameId ) ) ) {
            iFile.read ( reinterpret_cast < char * > ( & temp_riffSize ) , sizeof(temp_riffSize ) );
            Chunk::STREAM vec ( temp_riffSize ) ;
            iFile.read ( reinterpret_cast < char * > ( & vec[0] ) , temp_riffSize );
            collection.push_back ( Chunk ( temp_riffNameId , temp_riffSize , vec ) ) ;
        }
    }
  
    static char* StreamToChar(const Chunk::STREAM &v_data){
        //int size = v_data.size();
 
        char *data = new char[v_data.size()];
 
        for(unsigned int i = 0; i<v_data.size(); ++i){
            data[i]=v_data[i];
        }
 
        return data;
    }
 
 /*   static Chunk::STREAM CharsToStream (const char* data, int size){
        return Chunk::STREAM (data , data + size ) ;
    }
 */
    fmt* CharsToFmt(char * data_){
        fmt *dat;
        return dat = reinterpret_cast<fmt* >(data_);
    }
 
     void ShowInfo ( std::ostream & out ) {
 
        char *data = StreamToChar(collection[0].get_data());
        fmt * dat = CharsToFmt(data);
 
        out<<"audio format: "<<dat->audioFormat<<"\n"
            <<"num channels: "<<dat->numChannels<<"\n"
            <<"sample rate: "<<dat->sampleRate<<"\n"
            <<"byte rate: "<<dat->byteRate<<"\n"
            <<"block Align: "<<dat->blockAlign<<"\n"
            <<"bits per sample: "<<dat->bitsPerSample<<"\n"
            <<"extra fmt bytes: "<<dat->extraFmtBytes<<std::endl;
 
  
        //ВОТ ОНО
        Chunk::STREAM data_stream ( collection[getIndexChunkByName("data")].get_data() ) ;
 
        long double delim = 32768.0 ;
        for ( size_t i = 0 ; i < data_stream.size() ; i+=dat->bitsPerSample/8 )
        {
            int16_t * data16 = (int16_t*)&data_stream[i] ;
            out << data16 << '\n';
            out << std::fixed<<std::setprecision(15) << *data16/delim<< '\n' ;
        }
        //КОНЕЦ
 
        delete[] data;
    }
 
 
    inline int getIndexChunkByName(const std::string & chunkName ){
        int num = -1;
        for(unsigned int i = 0; i<collection.size(); i++){
            if(collection[i].get_name()==chunkName){
                num = i;
                break;
            }
        }
        return num;
    }
} ;
 
 
int main(){
 
    try{
        WaveFile wf ( "C:\\1.wav" ) ;
        std::ofstream outFile ("info.txt") ;
        if ( outFile )
            wf.ShowInfo ( outFile ) ;
 
    }catch(std::string msg){
        std::cerr<<msg<<std::endl;
    };
 }

Мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
 
#include <math.h>
 
#include <stdint.h>
//#include <iomanip>
 
using namespace std;
 
struct  WAV_HEADER
    {
 
        uint8_t       chunkId[4];     // RIFF Header
    uint32_t      chunkSize;      // RIFF Chunk Size
    uint8_t       format[4];      // WAVE Header
        uint8_t       subchunk1Id[4]; // FMT header
        uint32_t      subchunk1Size;  // Size of the fmt chunk
        uint16_t      audioFormat;    // Audio format 1=PCM
        uint16_t      numChannels;    // Number of channels 1=Mono 2=Sterio
        uint32_t      sampleRate;     // Sampling Frequency in Hz
        uint32_t      byteRate;       // bytes per second
        uint16_t      blockAlign;     // 2=16-bit mono, 4=16-bit stereo
        uint16_t      bitsPerSample;  // Number of bits per sample
 
// tak kak v faile pered DATA est' stroki LIST i INFO i INAM
    uint8_t       ListID[4];      // "list"  string
        uint32_t      ListSize;       // "list" length
    uint8_t       InfoID[4];   // "infonam"  string
    uint8_t       INamID[4];   // "infonam2"  string
//
// eshe est' kusok do data ramerom 10        
    uint8_t     blaiD[4];  // kusok do data
    short       blabla;    // kusok do data
//
        uint8_t       Subchunk2ID[4]; // "data"  string
        uint16_t      Subchunk2Size;  // Sampled data length
 
    };
 
 
int main()
{
 
        WAV_HEADER wavHeader;
    FILE *wavFile;
    int i=0;
 
    long headerSize = sizeof(wavHeader), filelength = 0;
 
    /*
    char FilePath[16]; //simbol in namefile
    scanf("%s", FilePath);
    wavFile = fopen(FilePath, "rb");
    */
 
     wavFile = fopen ("pilotag_wav.wav", "rb");
    //wavFile = fopen ("navigacia_wav.wav", "rb");
    //wavFile = fopen ("mashtab_wav.wav", "rb");
 
     if (wavFile!=NULL)
      {
        cout << "File Open\n"; 
      } 
      else 
      {
         cout << "File no open\n"; 
      }
      
        fread(&wavHeader,headerSize,1,wavFile);
    unsigned long size = wavHeader.Subchunk2Size; 
    printf("HeaderSize = %ld\n", headerSize);
    
        printf("Audio Format: %d\n", wavHeader.audioFormat);
        printf("Channels: %d\n", wavHeader.numChannels);
    printf("Sample rate (Hz): %d\n", wavHeader.sampleRate);
    printf("Byte per sec_play: %d\n", wavHeader.byteRate);
        printf("Byte per sample: %d\n", wavHeader.blockAlign);
    printf("Bits per sample: %d\n", wavHeader.bitsPerSample);
 
    // schitaem razmer faila
        int fileSize = 0;
            fseek(wavFile,0,SEEK_END);  // smeshaet kursor ot 0 do konza faila
            fileSize = ftell(wavFile);  // vozvrash. tekushyu poziciu v potoke
            cout << "File size: " << size << " bait" << endl;
        fseek(wavFile,0,SEEK_SET); // vozvrashaem ukazatel na nachalo faila
    //
 
    printf("Data size: %d\n", wavHeader.Subchunk2Size);
    
    cout << "WAVE = ";
    for(int i=0; i<4; i++)
        printf("%c", wavHeader.chunkId[i]);
    cout << "\n";
    cout << "Format = ";
    for(int i=0; i<4; i++)
        printf("%c", wavHeader.format[i]);
    cout << "\n";
    cout << "FMT = ";
    for(int i=0; i<4; i++)
        printf("%c", wavHeader.subchunk1Id[i]);
    cout << "\n";
 
 
    cout << "LIST = ";
    for(int i=0; i<4; i++)
        printf("%c", wavHeader.ListID[i]);
    cout << "\n";
    cout << "Info = ";
    for(int i=0; i<4; i++)
        printf("%c", wavHeader.InfoID[i]);
    cout << "\n";
    cout << "INam = ";
    for(int i=0; i<4; i++)
        printf("%c", wavHeader.INamID[i]);
    cout << "\n";
 
 
    cout << "DATA = ";
    for(int i=0; i<4; i++)
        printf("%c", wavHeader.Subchunk2ID[i]);
    cout << "\n";
 
/// po primery
    int sample_size = wavHeader.bitsPerSample / 8;
    int samples_count = wavHeader.Subchunk2Size * 8 / wavHeader.bitsPerSample;
 
    int32_t* pData = new int32_t [samples_count]; 
    int32_t value = 0;
 
    double *records = new double[samples_count]; 
    for (int i = 0; i < samples_count; i++)
        {
            //unsigned long value = 0;
            fread(&value, sample_size, 1, wavFile);  
        pData[i]= value;  // poluchau glubinu kodirovania zvuka ot 0 do 65536 urovnei
 
        //records[i] = (int16_t)pData[i];
        //printf("%i\n",records[i]);    
        //cout << std::fixed<<std::setprecision(15)<<records[i]/32768.0 <<'\n';
        //do something with value
        
 
 
    }
    
    fclose(wavFile); 
      
    return 0;
}
Вот такие у меня размерности типов, поэтому перешла к библиотеке #include <stdint.h>
C++
1
2
3
4
//printf("Long = %ld\n", sizeof(long)); //=8
//printf("Short = %ld\n", sizeof(short)); //=2
//printf("INT = %ld\n", sizeof(int)); //=4
//printf("DOUBLE = %ld\n", sizeof(double)); //=8
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,468
02.07.2015, 00:00
и еще раз повторим то что делает то что вы хотите (перемалывает файл и вытаскивает на свет чудо массив из цифр с точкой)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <mem.h>
#include <stdio.h>
#include <math.h>
 
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef short INT16;
 
struct wav_header_t
{
    char rId[4]; //"RIFF" = 0x46464952
    DWORD rLen; //28 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes] + sum(sizeof(chunk.id) + sizeof(chunk.size) + chunk.size)
    char wId[4]; //"WAVE" = 0x45564157
    char fId[4]; //"fmt " = 0x20746D66
    DWORD fLen; //16 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes]
    WORD wFormatTag;
    WORD nChannels;
    DWORD nSamplesPerSec;
    DWORD nAvgBytesPerSec;
    WORD nBlockAlign;
    WORD wBitsPerSample;
    //[WORD wExtraFormatBytes;]
    //[Extra format bytes]
};
 
struct chunk_t
{
    char id[4]; //"data" = 0x61746164
    DWORD size;
    //Chunk data bytes
};
 
int main(void)
{
    FILE *f = fopen("test.wav", "rb");
 
    wav_header_t header;
 
    fread(&header, sizeof(header), 1, f);
 
    printf("wFormatTag=%i\n", header.wFormatTag);
    printf("nChannels=%i\n", header.nChannels);
    printf("nSamplesPerSec=%li\n", header.nSamplesPerSec);
    printf("wBitsPerSample=%i\n", header.wBitsPerSample);
 
    fseek(f, header.fLen - 16, SEEK_CUR); //skip wExtraFormatBytes & extra format bytes
 
    chunk_t chunk;
    printf("id\t" "size\n");
    while (true) //go to data chunk
    {
        fread(&chunk, sizeof(chunk), 1, f);
        printf("%c%c%c%c\t" "%li\n", chunk.id[0], chunk.id[1], chunk.id[2], chunk.id[3], chunk.size);
        if (*(DWORD *)&chunk.id == 0x61746164) break;
        fseek(f, chunk.size, SEEK_CUR); //skip chunk data bytes
    }
 
    int sample_size = header.wBitsPerSample / 8;
    int samples_count = chunk.size * 8 / header.wBitsPerSample;
 
    printf("samples_count=%i\n", samples_count);
 
    DWORD *value = new DWORD[samples_count];
    memset(value, 0, sizeof(DWORD) * samples_count);
 
    for (int i = 0; i < samples_count; i++)
    {
        fread(&value[i], sample_size, 1, f);
    }
 
    fclose(f);
 
    f = fopen("test.dat", "w");
    for (int i = 0; i < samples_count; i++)
    {
        //for 16 bits per sample only
        double x = (double)(INT16)value[i] / 0x8000;
        fprintf(f, "%1.17lf\n", x);
    }
    fclose(f);
 
    return 0;
}
0
84 / 4 / 0
Регистрация: 01.02.2012
Сообщений: 93
02.07.2015, 00:06  [ТС]
vxg, он пишет ошибку сегментирования, я пробовала, иначе не спрашивала бы.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,468
02.07.2015, 00:07
Цитата Сообщение от Trisha Ray Посмотреть сообщение
он пишет ошибку сегментирования
мой код не пишет. вы его пробовали?
0
84 / 4 / 0
Регистрация: 01.02.2012
Сообщений: 93
02.07.2015, 00:15  [ТС]
vxg, да ваш.

разобралась - у меня необходимо было еще добавить string.h, а то он не воспринимал нормально memset и стопорился(

Спасибо
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,468
02.07.2015, 00:24
Цитата Сообщение от Trisha Ray Посмотреть сообщение
стопорился
стопорился это вроде не сегментация которая на самом деле является чем то вроде аналога акцесс виолэйшн в юниксах. не за что, будем надеяться что вы сделаете то что хотите и никто не пострадает
0
0 / 0 / 0
Регистрация: 11.01.2014
Сообщений: 5
16.10.2017, 09:39
добрый день. подскажите а как вшить массив с данными обратно? у меня задача преобразовать данные и получить wav. для извлечения использовал ваш код, данные преобразовал а правильно вшить обратно не получается. думаю дело в последней строчке.
C++
1
2
3
4
5
    FILE *file;
    file=fopen("test2.wav", "wb");
    fwrite(&header, sizeof(header), 1, f);
    fwrite(&chunk, sizeof(chunk), 1, f);
    fwrite(&value[0], samples_count, sample_size, f);
Добавлено через 9 минут
разобрался. вод код
C++
1
2
3
4
5
6
7
8
9
FILE *file;
    file=fopen("test2.wav", "wb");
    fwrite(&header, sizeof(header), 1, f);
    fwrite(&chunk, sizeof(chunk), 1, f);
 
    for (int i = 0; i < samples_count; i++)
    {
        fwrite(&value[i], sample_size, 1, f);
    }
0
0 / 0 / 1
Регистрация: 29.08.2019
Сообщений: 17
01.02.2020, 20:49
Добрый день.
Переделал Ваш код для работы с 24 битным файлом.
Все отрицательные значения стали положительные 1.ххх .
Было
C++
1
2
3
4
5
6
7
8
   
typedef short INT16;
 for (int i = 0; i < samples_count; i++)
    {
        //for 16 bits per sample only
        double x = (double)(INT16)value[i] / 0x8000;
        fprintf(f, "%1.17lf\n", x);
    }
Стало
C++
1
2
3
4
5
6
7
8
9
    
typedef int INT32;
for (int i = 0; i < samples_count; i++)
    {
        //for 24 bits per sample only
        double x = (double)(INT32)value[i] / 8388608;   
        fprintf(f, "%.14lf\n", x);
        
    }
Пример:
было
0,1776463
-0,1582477
стало
0.17764627933502
1.84175229072571 -?
Подскажите где ошибка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.02.2020, 20:49

Считывание больших wav файлов частями
Привет ребята, столкнулся со следующей проблемой, у меня есть wav файл размером 2Gb, мне его нужно проанализировать, я понимаю что...

Запись и считывание информации в WAV-файл
Всем добрый день. Занимаюсь такой проблемой: необходимо записать в звуковой файл и считать из него определенную последовательность. При...

Нужна помощь в заказе семплов(Coilcraft). Оплата.
Добрый день уважаемые форумчане! Решил собрать терменвокс по схеме Роберта Муга (гуглить Etherwave Theremin) но появилась проблема -...

Написать программу, формирующую по исходному WAV файлу новый WAV файл
Написать программу, формирующую по исходному WAV файлу новый WAV файл, со сглаженным вершинами перегруженных (клипированных) фрагментов....

Применить фильтр который будет брать первые 5 семплов, считать среднее и записывать в другой массив
Есть массив звука (например 1024 штуки). Есть параметр ширины окна (например 5 семплов). Нужно применить фильтр который будет брать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
53
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru