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

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

On 2/4/2020 at 1:05 PM, zoolu said:

1.jpg

Попробуйте Clock Polarity поменять на Low
И communication Standard на MSB . У меня в настройках проекта такие параметры были. 

Завтра STM32F4Discovery из дома на работу принесу подробнее еще разберу. 

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


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

Я окончательно запутался.... Тактирую микрофон частотой 1Мгц. Забираю с него данные по 16 бит. Получается 1 полуслово я получаю с частотой 64кГц. При децимейшн факторе 64 мне в фильтр нужно скормить 32 полуслова. Соответственно я их приму с частотой 2кГц. Где обещанная частота дискретизации 16кГц? Что я делаю не так?

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


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

При децимейшн факторе 64 вам нужно скормить 4 полуслова, а не 32. 
DECIMATION_FACTOR_64 - это 64 бита, одно полуслово это 16 бит. Соответственно 4 полуслова.

Начните сначала с самого простого, в настройках PDM фильтра поставьте outputSamplesNumber = 1;

Заведиде DMA

HAL_I2S_Receive_DMA(&hi2s2, PDM_BUFFER, 8);

 

В обработчике по заполнению половины буфера и полного буфера скармливайте PDM фильтру соответственно первые 4 полуслова, и последние 4 полуслова.  Все должно работать.

 

В моем проекте фильтр настроен на 256 выходных значений. Decimation Factor 64 .       1 / (64 * 256 / 1025000) = 62.5 Гц. 
Каждые 62.5 Гц у меня заполняется по половине буфера. Осциллограф тоже самое подтверждает

 

image.thumb.png.04c7eff186318e27257ebe444db6c484.png

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


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

Ох ёмоё!!! Спасибо огромное! Перепутать байты и биты..... Все заработало просто отлично! 

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


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

Ура ))

А что за проект делаете если не секрет. И шимом я как понимаю вы звук с микрофона куда то выводите?

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


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

Микрофон-манипулятор для громкоговорящей установки. Следующий этап развития- прикручивание библиотеки AEC))) А ШИМ да, через RC цепочку и на УНЧ.

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


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

А я не стал с AEC разбираться , хотя нужно тоже осваивать. 

 

Через ШИМ + RC цепочка звук лучше чем через 12 битный ЦАП получается?

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


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

Да нет, я бы не сказал. Чтобы вывести частоту ШИМ далеко за звуковую, приходится снижать его разрядность. Я в итоге имею при частоте МК 84Мгц 10-ти битный ШИМ с частотой 82кГц. И 10-битный ШИМ лучше чем 8-битный ЦАП))) Если есть возможность использовать 12-бит ЦАП, то это самый лучший вариант.

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


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

zoolu а можете показать код каким образом вы звук выводите ?
 У меня при передаче через ЦАП частые щелчки, скорее всего дело в рассинхронизации скорости работы SAI и таймера работы с ЦАП

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


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

Добрый день,
можете поделиться проектом с этим микрофоном? Я борюсь вторую неделю подряд, никак не работает. Слышен треск, но ....

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


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

Я разобрался с этим вопросом.

проект https://drive.google.com/file/d/1QUBxso2SIrSIxNUaaQ84a-vVT9O6Jsrv/view?usp=sharing

Теория здесь https://youtu.be/g8fs3wJxCtY

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


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

On 8/24/2020 at 8:29 AM, BorisBritwa said:

Я разобрался с этим вопросом.

проект https://drive.google.com/file/d/1QUBxso2SIrSIxNUaaQ84a-vVT9O6Jsrv/view?usp=sharing

Теория здесь https://youtu.be/g8fs3wJxCtY

хмм.. а как запустить , чтобы хоть как-то заработало? ( у меня stm32cubeide, stm32f407**disc)

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

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


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

Здравствуйте! Ковыряюсь с микрофоном на discovery-F4. Не могу никак понять как эта штука работает.

Вот стандартная настройка:

/* PDM2PCM init function */
void MX_PDM2PCM_Init(void)
{
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */

   /**
  */
  PDM1_filter_handler.bit_order = PDM_FILTER_BIT_ORDER_LSB;
  PDM1_filter_handler.endianness = PDM_FILTER_ENDIANNESS_BE;
  PDM1_filter_handler.high_pass_tap = 2104533974;
  PDM1_filter_handler.in_ptr_channels = 1;
  PDM1_filter_handler.out_ptr_channels = 1;
  PDM_Filter_Init(&PDM1_filter_handler);

  PDM1_filter_config.decimation_factor = PDM_FILTER_DEC_FACTOR_64;
  PDM1_filter_config.output_samples_number = 16;
  PDM1_filter_config.mic_gain = 0;
  PDM_Filter_setConfig(&PDM1_filter_handler, &PDM1_filter_config);

  /* USER CODE BEGIN 3 */
  /* USER CODE END 3 */

}
static uint8_t I2S2_Init(uint32_t AudioFreq)
{
	/* Initialize the hAudioInI2s Instance parameter */
	hAudioInI2s.Instance = I2S2;

	/* Disable I2S block */
	__HAL_I2S_DISABLE(&hAudioInI2s);

	/* I2S2 peripheral configuration */
	hAudioInI2s.Init.AudioFreq = I2S_AUDIOFREQ_16K;
	hAudioInI2s.Init.ClockSource = I2S_CLOCK_PLL;
	hAudioInI2s.Init.CPOL = I2S_CPOL_LOW;
	hAudioInI2s.Init.DataFormat = I2S_DATAFORMAT_16B_EXTENDED;
	hAudioInI2s.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
	hAudioInI2s.Init.Mode = I2S_MODE_MASTER_RX;
	hAudioInI2s.Init.Standard = I2S_STANDARD_MSB;

	/* Initialize the I2S peripheral with the structure above */
	if (HAL_I2S_Init(&hAudioInI2s) != HAL_OK)
	{
		return AUDIO_ERROR;
	}
	else
	{
		return AUDIO_OK;
	}
}

Затем запускаем прием по DMA в цикле.

1. На микрофон идет 1,024 Мгц () (2 канала X 16кГц X 32бит). L/R подтянут к земле, значит работает левый канал. Но i2s работает с 2мя каналами, т.е в PDM потоке, который будет DMA писать в буфер будет 2 канала, причем в правом будет какой-то шум, т.к второго микрофона нет?

2. bit_order это порядок бит в PDM потоке. endianness - порядок байт в PCM?

3. Как работают  in_ptr_channels, out_ptr_channels? Почему, если во входном потоке у нас по идее 2 канала, везде пишут 1 канал?

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

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


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

У вас получилось? Такие же вопросы имею про 2 канала.

02.09.2021 в 15:27, GMVM сказал:

Здравствуйте! Ковыряюсь с микрофоном на discovery-F4. Не могу никак понять как эта штука работает.

Вот стандартная настройка:


/* PDM2PCM init function */
void MX_PDM2PCM_Init(void)
{
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */

   /**
  */
  PDM1_filter_handler.bit_order = PDM_FILTER_BIT_ORDER_LSB;
  PDM1_filter_handler.endianness = PDM_FILTER_ENDIANNESS_BE;
  PDM1_filter_handler.high_pass_tap = 2104533974;
  PDM1_filter_handler.in_ptr_channels = 1;
  PDM1_filter_handler.out_ptr_channels = 1;
  PDM_Filter_Init(&PDM1_filter_handler);

  PDM1_filter_config.decimation_factor = PDM_FILTER_DEC_FACTOR_64;
  PDM1_filter_config.output_samples_number = 16;
  PDM1_filter_config.mic_gain = 0;
  PDM_Filter_setConfig(&PDM1_filter_handler, &PDM1_filter_config);

  /* USER CODE BEGIN 3 */
  /* USER CODE END 3 */

}

static uint8_t I2S2_Init(uint32_t AudioFreq)
{
	/* Initialize the hAudioInI2s Instance parameter */
	hAudioInI2s.Instance = I2S2;

	/* Disable I2S block */
	__HAL_I2S_DISABLE(&hAudioInI2s);

	/* I2S2 peripheral configuration */
	hAudioInI2s.Init.AudioFreq = I2S_AUDIOFREQ_16K;
	hAudioInI2s.Init.ClockSource = I2S_CLOCK_PLL;
	hAudioInI2s.Init.CPOL = I2S_CPOL_LOW;
	hAudioInI2s.Init.DataFormat = I2S_DATAFORMAT_16B_EXTENDED;
	hAudioInI2s.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
	hAudioInI2s.Init.Mode = I2S_MODE_MASTER_RX;
	hAudioInI2s.Init.Standard = I2S_STANDARD_MSB;

	/* Initialize the I2S peripheral with the structure above */
	if (HAL_I2S_Init(&hAudioInI2s) != HAL_OK)
	{
		return AUDIO_ERROR;
	}
	else
	{
		return AUDIO_OK;
	}
}

Затем запускаем прием по DMA в цикле.

1. На микрофон идет 1,024 Мгц () (2 канала X 16кГц X 32бит). L/R подтянут к земле, значит работает левый канал. Но i2s работает с 2мя каналами, т.е в PDM потоке, который будет DMA писать в буфер будет 2 канала, причем в правом будет какой-то шум, т.к второго микрофона нет?

2. bit_order это порядок бит в PDM потоке. endianness - порядок байт в PCM?

3. Как работают  in_ptr_channels, out_ptr_channels? Почему, если во входном потоке у нас по идее 2 канала, везде пишут 1 канал?

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

У вас получилось? Такие же вопросы имею про 2 канала.

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


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

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

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

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

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

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

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

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

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

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