У меня есть код, который принимает входные данные с микрофона и передает спектрограмму через 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
Имитирование ввода WAVEHDR для потоковой передачи спектрограммы из файла ⇐ C++
Программы на C++. Форум разработчиков
1736576689
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79340138/mimicking-wavehdr-input-to-stream-spectrogram-from-file[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия