Имитирование ввода WAVEHDR для потоковой передачи спектрограммы из файлаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Имитирование ввода WAVEHDR для потоковой передачи спектрограммы из файла

Сообщение Anonymous »

У меня есть код, который принимает входные данные с микрофона и передает спектрограмму через OpenCV. Это отлично работает:
while (cv::waitKey(10) != 27) {

waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR)); /* Prepare header for input */
if (waveInAddBuffer(hWaveIn, &WaveInHdr, sizeof(WAVEHDR))) return -1; /* Insert a wave input buffer */
if (waveInStart(hWaveIn)) return -1; /* Commence sampling input */
/* Wait until finished recording */
do {} while (waveInUnprepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING);

addInput(WaveInHdr);
cv::imshow("Spectrogram", spectrogram.getDetailedSpectrogram(20, cv::COLORMAP_JET));
}

Вышеуказанный входной сигнал с микрофона обрабатывается с помощью функции addInput. Затем это коротковременное преобразование Фурье и разрезание на отдельные векторы-столбцы, например:
hconcat(line, spectrogram->colRange(0, spectrogram->cols - 1), *spectrogram);

Мне хотелось сделать то же самое, но с использованием амплитуд напряжения, записанных в файл CSV. Я могу построить спектрограммы, но не уверен, как их «потоковать».
По сути, я пытаюсь делать то, что делает код микрофона, то есть передавать данные в потоковом режиме. вместо того, чтобы просто создавать один график, и я не знаю, как это сделать из файла. Первоначально я собирался попытаться имитировать класс WAVEHDR, повторно использовать код микрофона, каким-то образом превратив свой вектор амплитуды в lpData, но это кажется слишком запутанным.
(Примечание: код Я использую спектрограмму микрофона, адаптированную из https://github.com/njanakiev/audio-spectrogram)
Редактировать: пытаюсь выровнять lpData с моей амплитудой вектор:
void FileStream::read_file(std::string filePath, size_t bufferSize) {

std::ifstream file;
file.open(filePath);
std::vector times, x;
char* chBuffer = new char[bufferSize];
while (file)
{
file.read(chBuffer, bufferSize);
auto bytesRead = file.gcount();
if (bytesRead == 0) {
break;
}

std::string str = chBuffer;
int beg = 0, end = 0;
while (end = str.find('\n', beg + 1))
{
std::string input_str = str.substr(beg, end - beg);
int pos = input_str.find_first_of(' ');
double amplitude = std::atof((input_str.substr(pos + 1)).c_str());
if (end == -1)
{
x.push_back(amplitude);
std::copy(x.begin(), x.end(), samples);
get_sample(32e3, 1);
x.clear();
break;
}
x.push_back(amplitude);
beg = end;
}
}
}

И функция get_sample
int FileStream::get_sample(int fs, int channels)
{
using namespace little_endian_io;
const int bitDepth = 16;
std::ofstream f("example.wav", std::ios::binary);

// Write the file headers
f

Подробнее здесь: https://stackoverflow.com/questions/793 ... -from-file
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»