Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> wav файл, данные из wav файла в массив 
:(
    Опции темы
alexwin
Дата 17.4.2017, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 17.4.2017

Репутация: нет
Всего: нет



Здравствуйте

Помогите пожалуйста с задачкой  smile 

прочитать данные в массив из wav файла без заголовка (заголовок читается у меня  smile , не знаю как в массив прочитать smile , чтобы потом работать только с массивом ) и на основе этого массива написать процедуру преобразование Фурье
Для преобразования Фурье использовать метод трапеций или парабол 
Код




#include <cstdlib>
#include <iostream>
#include <fstream>
#include <windows.h>

using namespace std;

struct WAVHEADER
{
    char                chunkId[4];                 // Информация о формате файла (RIFF), Содержит символы “RIFF” в ASCII кодировке;
    unsigned long       ChunkSize;                  // Размер без  chunkId[4];
    char                format[4];                  // Формат потоковых данных (WAVE);
    char                subchunk1Id[4];             // Описание параметров WAV-файла (fmt-chunk);
    unsigned long       subchunk1Size;              // Размер подструктуры  subchunk1  (16 байт);
    unsigned short      wFomatTag;                  // Аудио формат (PCM = 1);
    unsigned short      nChannels;                  // Количество каналов (Моно = 1, Стерео = 2);
    unsigned long       SamplesPerSec;              // Частота дискретизации в Гц;
    unsigned long       ByteRate;                   // Кол-во передаваемых байт в секунду воспроизведения;
    unsigned short      blockAlign;                 // Выравнивание блока данных Размер сэмпла в байтах 16 бит = 2 байта моно, 32 бита = 4 байта стерео (включая все каналы);
    unsigned short      BitsPerSample;              // Количество бит в сэмпле. Так называемая “глубина” или точность звучания. 8 бит, 16 бит и т.д. /// битов на отсчет
    char                Subchunk2ID[4];             // Символы "Data", начало чанка данных;
    unsigned long       Subchunk2Size;              // Размер области данных в байтах;
    unsigned char       rawData[491516] ;           // Raw sound data;
};


int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "Russian");
    FILE *wav;
    wav = fopen("C:\\Windows\\Media\\Alarm01.wav", "rb");
    if(wav!=NULL)
    cout<<"файл открыт для чтения\n";
   
  
   
        WAVHEADER header;

    fread(&header, sizeof(WAVHEADER), 1, wav);
 
    // Выводим полученные данные
    printf("\n  Считывание заголовка WAV-файла\n-------------------------------------------------\n");
    
    
    printf(" Инфо о формате:                        %c%c%c%c\n", header.chunkId[0], header.chunkId[1], header.chunkId[2], header.chunkId[3]);
    printf(" Размер:                                %ld байт\n", header.ChunkSize);
    printf(" Формат данных:                         %c%c%c%c\n", header.format[0], header.format[1], header.format[2], header.format[3]);
    printf(" Параметы WAV-файла:                    %c%c%c%c\n", header.subchunk1Id[0], header.subchunk1Id[1], header.subchunk1Id[2], header.subchunk1Id[3]);
    printf(" Размер подструктуры subchunk1Size:     %ld\n", header.subchunk1Size);
    printf(" Аудио формат PCM = 1:                  %d\n", header.wFomatTag);
    printf(" Каналов:                               %d", header.nChannels);
    if (header.nChannels == 2)
    {
        printf("         => Стерео \n");
    }
    else
    {
        printf("         => Моно \n");
    }
    printf(" Частота дискретизации:                 %d Гц\n", header.SamplesPerSec);
    printf(" Байт в секунду:                        %ld\n", header.ByteRate);
    printf(" Выравнивание блока данных в байтах:    %d\n", header.blockAlign);
    printf(" Дискретность-Количество бит сэмпла:    %d бит\n", header.BitsPerSample);
    printf(" Символы 'Data', начало чанка данных:   %c%c%c%c\n", header.Subchunk2ID[0],header.Subchunk2ID[1],header.Subchunk2ID[2],header.Subchunk2ID[3]);
    printf(" Размер области данных:                 %ld байт\n", header.Subchunk2Size);
  
  /* Длительность воспроизведения в секундах
    float fDurationSeconds = 1.f * header.Subchunk2Size / (header.BitsPerSample / 8) / header.nChannels / header.SamplesPerSec;
    int iDurationMinutes = (int)(fDurationSeconds) / 60;
    fDurationSeconds = fDurationSeconds - (iDurationMinutes * 60);
    printf(" Продолжительность:       %02d:%02.f\n", iDurationMinutes, fDurationSeconds);
    */
    cout << "Press the enter key to continue ...";
    cin.get();
    return EXIT_SUCCESS;
}

PM MAIL   Вверх
rudolfninja
Дата 17.4.2017, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



После того, как считали заголовок, нужно узнать сколько байтов осталось в файле и запихнуть их в массив.
Код

long current_pos= ftell(wav);  // вернуть текущее положение внутреннего указателя
fseek(wav, 0, SEEK_END); 
long size = ftell(wav) - current_pos;
char * buffer = (char*) malloc(sizeof(char) * size);
fseek(wav, current_pos , SEEK_SET ); 
fread(buffer, 1, size, wav);
puts(buffer); // после этого в буфере должно находиться содержимое файла
fclose(wav);


P.S. после того, как выполните преобразование Фурье, не забудьте освободить буфер.
P.P.S. сначала убидитесь, что бы значение size было подсчитатно верно. Я на 100% не уверен в правильности метода, который я предложил для подсчета размера, но, вроде как, верно в нем все.


Это сообщение отредактировал(а) rudolfninja - 17.4.2017, 17:46
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.