Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
korul
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 9
#1

Ошибка загрузки сэмплов из WAV - C++

20.02.2014, 00:48. Просмотров 778. Ответов 5
Метки нет (Все метки)

Здравствуйте, извиняюсь сразу,миллион раз обсуждали эту проблему,но поиск мне не помог ее решить.
у меня программа загружает wav файл и потом я должен получить массив с отчетами, я не знаю как учесть заголовок,чтобы он не записывался в сэмплы, но беда вся в том , что n (количество отчетов) у меня получается в 2 раза больше чем j (сколько отчетов записывается в массив) ,зарание благодарен
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
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <math.h>
#include <iostream>
#include <fstream>
 
using namespace std;
// Структура, описывающая заголовок WAV файла.
struct WAVHEADER
{
    // WAV-формат начинается с RIFF-заголовка:
 
    // Содержит символы "RIFF" в ASCII кодировке
    // (0x52494646 в big-endian представлении)
    char chunkId[4];
 
    // 36 + subchunk2Size, или более точно:
    // 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
    // Это оставшийся размер цепочки, начиная с этой позиции.
    // Иначе говоря, это размер файла - 8, то есть,
    // исключены поля chunkId и chunkSize.
    unsigned long chunkSize;
 
    // Содержит символы "WAVE"
    // (0x57415645 в big-endian представлении)
    char format[4];
 
    // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
    // Подцепочка "fmt " описывает формат звуковых данных:
    
    // Содержит символы "fmt "
    // (0x666d7420 в big-endian представлении)
    char subchunk1Id[4];
 
    // 16 для формата PCM.
    // Это оставшийся размер подцепочки, начиная с этой позиции.
    unsigned long subchunk1Size;
 
    // Аудио формат, полный список можно получить здесь [url]http://audiocoding.ru/wav_formats.txt[/url]
    // Для PCM = 1 (то есть, Линейное квантование).
    // Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
    unsigned short audioFormat;
 
    // Количество каналов. Моно = 1, Стерео = 2 и т.д.
    unsigned short numChannels;
 
    // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
    unsigned long sampleRate;
 
    // sampleRate * numChannels * bitsPerSample/8
    unsigned long byteRate;
 
    // numChannels * bitsPerSample/8
    // Количество байт для одного сэмпла, включая все каналы.
    unsigned short blockAlign;
 
    // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
    unsigned short bitsPerSample;
 
    // Подцепочка "data" содержит аудио-данные и их размер.
 
    // Содержит символы "data"
    // (0x64617461 в big-endian представлении)
    char subchunk2Id[4];
 
    // numSamples * numChannels * bitsPerSample/8
    // Количество байт в области данных.
    unsigned long subchunk2Size;
 
    // Далее следуют непосредственно Wav данные.
    
};
 
 
 
 
 
 
int main()
{
    setlocale(LC_CTYPE,"Russian");
    FILE *file;
    errno_t err;
    err = fopen_s(&file, "Slipknot - Three Nil.wav", "rb");
    if (err)
    {
        printf_s("Failed open file, error %d", err);
        return 0;
    }
 
    WAVHEADER header;
 
    fread_s(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), 1, file);
 
    // Выводим полученные данные
    printf_s("Sample rate: %d\n", header.sampleRate);
    printf_s("Channels: %d\n", header.numChannels);
    printf_s("Bits per sample: %d\n", header.bitsPerSample);
 
 
   // Посчитаем длительность воспроизведения в секундах
float fDurationSeconds = 1.f * header.subchunk2Size / (header.bitsPerSample / 8) / header.numChannels / header.sampleRate;
int iDurationMinutes = (int)(fDurationSeconds) / 60;
fDurationSeconds = fDurationSeconds - (iDurationMinutes * 60);
printf_s("Duration: %02d:%02.f\n", iDurationMinutes, fDurationSeconds);
 
//выгрузим данные из wav    
 ifstream in ("Slipknot - Three Nil.wav", ios::binary); // open file
    if(!in) {cout << "LOX"; return 0;} 
    in.seekg(0, ios::end);
 
    long q=in.tellg();
    long bitsize = 8*in.tellg();
    //размер файла в байтах. 1 бит - 1 цифра. т.о. размер *8=количество элементов/32 получим кол-во отчетов
    long n = (bitsize/header.bitsPerSample*header.numChannels);
 
 
   // long n=header.subchunk2Size*8/(header.numChannels * header.bitsPerSample);
 
    float *data = new float[n];  //объявляем массив данных выбранного канала
    
    ifstream instrm ("Slipknot - Three Nil.wav", ios::binary); //заново открываем для считывания данных
    float a = 0;
    int j = 0;
    int i = 0;
    cout << "\nЗагрузка данных в память\n" << endl;
    while(instrm.read((char *)&a, sizeof(float)))   // читаем числа по одному из файла и заполняем массив
    {                                             
        data[j] = a;
        //cout<<data[j]<<endl;
        j++;                    
           
    }
    cout << "Загрузка " << j << " объектов завершена\n" << endl;  
 
    fclose(file);
 
   
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2014, 00:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка загрузки сэмплов из WAV (C++):

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

Ошибка при попытке загрузки файла - C++
Задача состоит в том, чтобы по очереди загрузить файлы, введя их имена в консоль. #include &lt;fstream&gt; #include &lt;iostream&gt; using...

Ошибка сохранения/загрузки объекта с файла - C++
Привет всем. Столкнулся с проблемой сохранения/загрузки объекта в/из файла. Вытащил из моего проекта куски кода, и создал новый проект,...

Количество сэмплов - LabVIEW
На входе аналоговый сигнал, который вырезается стробом. Нужно на этом участке определить амплитуды каждого дискрета, пока показывает только...

Проигрыватель Wav (ошибка в программе) - C++ Builder
#include &quot;stdafx.h&quot; #include &quot;windows.h&quot; #include &quot;mmsystem.h&quot; #include &quot;stdio.h&quot; #include &quot;string.h&quot; #include &lt;iostream&gt; using...

Ошибка при воспроизведении WAV файла - C#
пытался проиграть файл, using System; using System.Media; namespace ConsoleApplication1 { class Program { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DrOffset
7149 / 4290 / 967
Регистрация: 30.01.2014
Сообщений: 7,092
20.02.2014, 03:02 #2
Уже глубокая ночь и могу ошибиться, но мне кажется зря ты второй раз файл открываешь.
Сперва считал заголовок, потом используя этот же открытый поток, читаешь данные. Должно быть все нормально.
0
korul
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 9
20.02.2014, 14:16  [ТС] #3
Даже если я его открою, вытащу из заголовка все что нужно, закрою и заново открою ,чтобы забрать отчеты из ваф ,то он серавно в 2 раза меньше отчетов загружает . n в два раза больше j ( и как мне ,когда открываю второй раз пропустить заголовок,его не загружать в массив,а сразу начать с отчетов?
0
DrOffset
7149 / 4290 / 967
Регистрация: 30.01.2014
Сообщений: 7,092
20.02.2014, 14:28 #4
Цитата Сообщение от korul Посмотреть сообщение
Даже если я его открою, вытащу из заголовка все что нужно, закрою и заново открою ,чтобы забрать отчеты из ваф ,то он серавно в 2 раза меньше отчетов загружает . n в два раза больше j ( и как мне ,когда открываю второй раз пропустить заголовок,его не загружать в массив,а сразу начать с отчетов?
Зачем вообще файл закрывать? Читаете сначала заголовок, потом данные, в одной "сессии".
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 2
20.02.2014, 14:39 #5
Цитата Сообщение от korul Посмотреть сообщение
он серавно в 2 раза меньше отчетов загружает
Тут четыре варианта:
1) Вы неправильно считаете количество отсчетов.
2) Количество отсчетов вычислено правильно, но тип данных, необходимый под 1 отсчет у вас в 2 раза меньше чем должен быть.
3) У вас 2 канала в звуке, а грузите 1.
4) Файл обработан кодеком (не стандартный).

Добавлено через 3 минуты

Не по теме:

Попробую сейчас ободрать какой-нибудь из своих старых проектов, чтобы вы могли сравнить.

0
korul
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 9
21.02.2014, 00:16  [ТС] #6
кол-во отсчетов считано правильно,так как через другую прогу считал количество отсчетов, которая точно правильно работает.
а какой тип данных надо использовать?
1 канал , там не песня,а специальный файл,где я знаю количество отсчетов ,то что он 32 битный , однокональный,моно.

Добавлено через 5 часов 49 минут
нашел чей то проект,чуть чуть преобразовал свой - в итоге получил
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
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <math.h>
#include <iostream>
#include <fstream>
 
using namespace std;
 
struct Wav_Header
{
    char Wav_ChunkId[4];
    int Wav_ChunkSize;
    char Wav_Format[4];
    char Wav_SubChunkId[4];
    int Wav_SubChunkSize;
    short int Wav_AudioFormat;
    short int Wav_NumChannels;
    int Wav_SampleRate;
    int Wav_ByteRate;
    short int Wav_BlockAlign;
    short int Wav_BitPerSample;
    char Wav_SubChunk2Id[4];
    int Wav_SubChunk2Size;
};
 
 
 
int main()
{
    FILE *rd_wav;
    Wav_Header ob1;
    cout<<sizeof(short)<<endl;
    if ((rd_wav=fopen("Slipknot - Three Nil.wav","rb"))==NULL)
        {
        fprintf(stderr,"owibka otkritiya faila dlya 4teniya");
        return 1;
        }
 
    fread(&ob1,sizeof(ob1),1,rd_wav);
    cout<<ob1.Wav_ChunkSize<<endl;
    for (int i=0; i<4; i++)
        cout<<ob1.Wav_ChunkId[i];
    cout<<'\n';
    for (int i=0; i<4; i++)
        cout<<ob1.Wav_Format[i];
    cout<<'\n';
    for (int i=0; i<4; i++)
        cout<<ob1.Wav_SubChunkId[i];
    cout<<'\n';
    cout<<ob1.Wav_SubChunkSize<<endl;
    cout<<ob1.Wav_AudioFormat<<endl;
    cout<<ob1.Wav_NumChannels<<endl;
    cout<<ob1.Wav_SampleRate<<endl;
    cout<<ob1.Wav_ByteRate<<endl;
    cout<<ob1.Wav_BlockAlign<<endl;
    cout<<ob1.Wav_BitPerSample<<endl;
    for (int i=0; i<4; i++)
        cout<<ob1.Wav_SubChunk2Id[i];
    cout<<'\n';
    cout<<ob1.Wav_SubChunk2Size<<endl;
    /*
    short* buffer=new short [ob1.Wav_SubChunk2Size/2];
    fread(buffer, 2, ob1.Wav_SubChunk2Size/2, rd_wav);
    */
  char *pBuf = ( char * )malloc( sizeof( char ) * ob1.Wav_SubChunk2Size );
  fread( pBuf, 1, ob1.Wav_SubChunk2Size, rd_wav );
 
  fclose(rd_wav);
 
 
 
/*
    pFile = fopen( "RAW.raw", "wb" ); 
  BYTE RAW[256][256] = {0};
  BYTE bL = 0;
  for(int i = 0; i < ob1.Wav_SubChunk2Size; i++ )
  {
    bL = 256-pBuf[i];
    RAW[ bL ][ i/(ob1.Wav_SubChunk2Size/256) ] = 254;
  }
  fwrite( RAW, sizeof(RAW), 1, pFile );
*/
 
 
  //  delete [] buffer;
    
    return 0;
}
Можно ли такой тип данных использовать для хранения отсчетов?
Как их вывести или посчитать кол-во для того,чтобы проверить правильность?
ну эт более сложное - как отсчеты из массива перегнать в вектор ,для последующего БПФ?

Добавлено через 2 минуты
вся загвоздка в этих 2х строках,помогите пожалуйста)
C++
1
2
 char *pBuf = ( char * )malloc( sizeof( char ) * ob1.Wav_SubChunk2Size );
  fread( pBuf, 1, ob1.Wav_SubChunk2Size, rd_wav );
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2014, 00:16
Привет! Вот еще темы с ответами:

Конвертация аудиофайлов WAV -> WAV - Delphi
Здравствуйте! Подскажите, пожалуйста, библиотечку (утилитку коммандной строки, как вариант), для конвертации из &quot;тяжёлого&quot; wav в лёгкий, с...

Нужно подобрать математический аппарат для определения точек вхождения сэмплов в более большом файле - Цифровая обработка сигналов
Здравствуйте. Помогите, пожалуйста подобрать алгоритм для нахождения точек вхождения каждого из сэмплов (они образуют массив из, скажем, 20...

После загрузки Windows сразу вылетает ошибка: todo: file description обнаружена ошибка. Приложение будет закрыто. - Компьютерное железо
После загрузки Виндовса сразу вылетает ошибка: todo: file description обнаружена ошибка. Приложение будет закрыто. Помогите...

Ошибка загрузки - Софт
Помогите , почему при закачке ВСЕ торренты останавливаются на 99%, при этом скорость есть, но они не качаются. Другие клиенты пробовал,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.02.2014, 00:16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru