Проблема з I2S ADC на ESP32
Доброго дня!
Спроба зняття сигналу з АЦП через інтерфейс I2S зазнала невдачі.
Cхоже я не отримую бажану частоту дискретизації (10000 Гц)
// Initialization of I2S buffer
uint16_t* i2sReadBuffer = (uint16_t*)calloc(DMA_BUFFER_LEN, sizeof(uint16_t));
size_t bytesRead;
while (1) {
// Read data in the buffer till its not full
i2s_read(ADC_I2S_NUM, (void*)i2sReadBuffer, DMA_BUFFER_LEN * sizeof(uint16_t), &bytesRead, portMAX_DELAY);
for (size_t i = 0; i < DMA_BUFFER_LEN; i++) {
uint16_t value = i2sReadBuffer[i];
printf("%d\n", value);
}
}
Сигнал через UART я отримав і відфільтрував.
Але фільтр адекватно працює тільки з коефіцієнтами, що були задані для частоти дискретизації 1кГц.
MatLab код для обробки сигналу:
xlsFile = 'ecg_data.xlsx';
[num, txt, raw] = xlsread(xlsFile);
input = cell2mat(raw);
a = fir1(100, [0.06 0.14], 'stop'); % BandStop фільтр
in = input(:, 2);
filtered = filter(a, 1, in);
y = fft(filtered);
N = length(y); % Довжина вектора
f = (0:N - 1 ) * 100 / N; % Частотний вектор
m = abs(y); % Амплітуда
% y(m<1e-6) = 0;
p = unwrap(angle(y)); % Фаза
X_vector = (1:3:N) / ((N - 1) * 1e-3);
title('Частотний аналіз')
subplot(2,2,1)
plot(f,m)
title('АЧХ')
ax = gca;
ax.XTick = X_vector;
subplot(2,2,2)
plot(f,p*180/pi)
title('ФЧХ')
ax = gca;
ax.XTick = X_vector;
subplot(2,2,3)
plot(in)
title('Вхідний сигнал')
xlabel('msec')
ax = gca;
subplot(2,2,4)
plot(filtered)
title('Відфільтрований сигнал')
ax = gca;
Конфігурація I2S
#define SAMPLING_FREQ 10000
#define ADC_CHANNEL ADC1_CHANNEL_4
#define ADC_UNIT ADC_UNIT_1
#define DMA_BUFFER_LEN 1024
#define ADC_I2S_NUM I2S_NUM_0
static void init_i2s_adc(void) {
i2s_config_t i2s_config =
{
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN),
.sample_rate = SAMPLING_FREQ,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
.communication_format = I2S_COMM_FORMAT_STAND_MSB,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 8,
.dma_buf_len = DMA_BUFFER_LEN,
.tx_desc_auto_clear = 1,
.use_apll = 0,
};
adc1_config_channel_atten(ADC_CHANNEL, ADC_ATTEN_11db);
adc1_config_width(ADC_WIDTH_12Bit);
i2s_driver_install(ADC_I2S_NUM, &i2s_config, 0, NULL);
i2s_set_clk(ADC_I2S_NUM, SAMPLING_FREQ, I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_MONO);
i2s_set_adc_mode(ADC_UNIT, ADC_CHANNEL);
i2s_adc_enable(ADC_I2S_NUM);
}
Чи не означає це те що реально частота дискретизації 1кГц?
Хтось може допомогти виправити цю проблему?

10 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів