Перейти к содержанию
    

Помогите разобраться с цифровым микрофоном на плате STM32F4Discovery

Понял я почему такое сильное усиление получалось. Я в 16 битовом потоке младший байт за старший принимал, а старший за младший. Не понятно как вообще разборчивая речь получалась.


Поправил , теперь все встало на свои места

image.png.bf51e74646168daf84ea65ce4cbcf0dc.png

 

 

mic3.wav

Обнаружил новый глюк в даташите на PDM2PCM либу сказано:
image.png.d1f9d2854692db9169e83427c5e1b3f5.png

типо если не хотите использовать фильтр высокичх частот то вбивайте значение 0. Я попробовал вбить 0 и на выходе у меня все время единичный сигнал. Получался

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

image.thumb.png.5cabfb9c69292f64c9ee122471ee650e.png

Или тут 0 подразумевается значение не 0x00? А какой то определенный коэффициент  ? 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да я тоже подумал что 0 так и есть 0, но как посмотрел в либе там ождиается uint32_t , поэтому с обычным нулем и не работает. 

typedef struct{
  uint16_t bit_order;
  uint16_t endianness;
  uint32_t high_pass_tap;
  uint16_t in_ptr_channels;
  uint16_t out_ptr_channels;
  uint32_t pInternalMemory[PDM2PCM_INTERNAL_MEMORY_SIZE];
}PDM_Filter_Handler_t;


Что-то я как всегда сразу сам не догадался посмотреть. Обычно привык, что из коробки всегда все нормально заводилось CMSIS DSP например.

Действительно с 0x7FFFFFFF все хорошо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну в библиотеке тип данных указан uint32_t  , а в user manual сказано Q31 поэтому и не работает. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 минут назад, Mysteo сказал:

Ну в библиотеке тип данных указан uint32_t  , а в user manual сказано Q31 поэтому и не работает. 

И что? Здесь нет противоречия. Q0.31 - это формат содержимого uint32_t. Хотя логичней было бы конечно использовать не uint32, а int32. Так как Q0.31 - судя по контексту описания предполгается знаковым.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

Хотя логичней было бы конечно использовать не uint32, а int32

Вот именно это я и хотел донести )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ребята почему то случаются пощелкивания .... пока не понимаю из-за чего. 
Ошибок в передачи данных быть не может. В тишине и при разговоре никаикх пощелкиваний нет.

Но  когда записываю какой либо синусоидальный сигнал частые щелчки возникают, внезависимости от уровня громкости источника звука и расстояния динамика до микрофона.

Вот две записи:
speech - я записал сначала немножко тишину потом все ближе и ближе разговаривал к микрофону, вплоть до дистанции 5 см. 
tone - запись где я синусоидальный звук через динамик воспроизводил и записывал микрофоном, дистанция более 1.5 м. Громкость разную пробовал.
Дайте наводку, что может быть не так. 

speech.wav

tone.wav

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем это передача данных нарушена была.... Видать при голосе частоты все время разные ... и  не заметно, а при передачи синуса если хотя бы 1 значение вылетает из синусоиды то щелчок получается.

Попробовал сначала накопить аудио в RAM , а потом передать. Щелчков никаких не было . В общем можно сказать что освоил наконец-то PDM с горем пополам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день! Бьюсь уже наверное неделю с этим PDM2PCM.. Звук есть но сильно искаженный. Компьютерный какой-то... Я инициализирую буфер размерностью 2*DEC_FACTOR. В колбэке DMA запонения половины буфера запускаю фильтр и скармливаю ему готовую половину буфера 

void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s){
	PDM_Filter(&((uint8_t*)(pdm_mic_data))[0], (uint16_t*)&(pcm_mic_data[0]), &PDM1_filter_handler);
}

Затем в колбэке окончания заполнения буфера докармливаю фильтру вторую часть буфера и затем уже готовый буфер преобразую из знакового типа (фильтр же на выходе дает мне знаковые значения? Для меня это не очевидно) в беззнаковый и перекладываю на воспроизведение в ШИМ.

void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s){
	uint8_t sign;
	uint8_t j = 0;
	PDM_Filter(&((uint8_t*)(pdm_mic_data))[PDM_BUFF_SIZE/2], (uint16_t*)&(pcm_mic_data[PCM_OUT_SIZE]), &PDM1_filter_handler);
  
	for (uint8_t i = buf_ptr * PCM_OUT_SIZE; i < (buf_ptr * PCM_OUT_SIZE) + PCM_OUT_SIZE; i++){
		if (pcm_mic_data[j] > 0) sign = 1; else sign = 0;
		PWM_buf[i] = ABS(pcm_mic_data[j]) >> 6;
		if (sign) PWM_buf[i] = 0x200 + PWM_buf[i]; else PWM_buf[i] = 0x200 - PWM_buf[i];
		j++;
	}
  
}

Подскажите пожалуйста что я делаю не так?... 

P.S. Сигнал WS подключен к микрофону LR

1.jpg

2.jpg

Изменено пользователем zoolu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А куда вы выводите звук, чтобы проверить искаженный он или нет?
И вы потом выводите PCM звук или то что получаете в вашей функции PWM Buf?

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

 

И вроде как буфер Вы не правильно инициализировали. У вас PDM FACTOR 64 бита , это значит что подав на вход фильтра 8  байт (64 бита / 8) PDM сигнала получите  1 PCM отчет. А outputSamples у вас выбрано 16 , то есть фильтр ожидает от вас 8 * 16 = 128 байт. Таким образом 128 * 2  = 256 вам нужен рабочий буфер на 256 байт. При заполнении половины буфера в 128 байт скармливаете эти значения фильтру. При заполнении другой половины буфера , снова скармливаете

 

Плюс насколько я помню возня еще с этими HAL библиотеками была. Некорректно DMA буфер заполнялся. Так что проверьте верно ли заполняется у вас буфер
В общем все от начала до конца то что я написал проверьте. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получилось у меня в итоге вот что:

#define PCM_OUT_SIZE 16
#define PDM_BUFF_SIZE 256
#define PWM_BUFF_SIZE 256
#define PCM_BUFF_SIZE 32
#define BIAS 512

void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s){
	PDM_Filter(&((uint8_t*)(pdm_mic_data))[0], (uint16_t*)&(pcm_mic_data[0]), &PDM1_filter_handler);//получаем первые 16 отсчетов PCM
}

void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s){
	uint8_t sign;
	uint8_t j = 0;
	PDM_Filter(&((uint8_t*)(pdm_mic_data))[PDM_BUFF_SIZE/2], (uint16_t*)&(pcm_mic_data[PCM_BUFF_SIZE/2]), &PDM1_filter_handler);//вторые 16 отсчетов PCM
	for (uint16_t i = buf_ptr * PCM_BUFF_SIZE; i < (buf_ptr * PCM_BUFF_SIZE) + PCM_BUFF_SIZE; i++){//преобразуем в 10-битный ШИМ сигнал
		if (pcm_mic_data[j] > 0) sign = 1; else sign = 0;
		PWM_buf[i] = ABS(pcm_mic_data[j]) >> 6;
		if (sign) PWM_buf[i] = BIAS + PWM_buf[i]; else PWM_buf[i] = BIAS - PWM_buf[i];
		j++;
	}
	if (++buf_ptr > 8) buf_ptr = 0; //размер кольцевого буфера ШИМ = 8 * 32 отсчетов PCM
	if (buf_ptr == 4 && !PWM_buf_rdy){//При первом заполнении половины буфера ШИМ запускаем воспроизведение
		PWM_buf_rdy = 1;
		HAL_TIM_Base_Start_IT(&htim2);//таймер 2 с частотой дискретизации 16кГц подставляет новое значение в CCR1 TIM1 из буфера ШИМ
		HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
	}
}

Частота тактирования 1Мгц - проверено осциллографом. Но искажения остались... Увидел одну аморальность- первые два отсчета в pcm_mic_data всегда "битые". Резко выбиваются из остальных. Например при отсутствии сигнала на микрофоне заполнение буфера в районе "0". Но первые два значения могут быть 500 и -1000 например... Подозреваю, что искажения связаны именно с этими значениями...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...