Can an arduino perform this task (pulse counter) ?

try this on the CYD

// ESP32 - simple running average - measure pulse frequency using rising edge interrupts

//  average = (Current_reading + average) / 2

// updated for Arduino ESP32 core 3.0 see
// https://docs.espressif.com/projects/arduino-esp32/en/latest/api/timer.html

// CYD TFT setup
#include <Arduino.h>
#include <TFT_eSPI.h>

TFT_eSPI tft;

#define risePin 22  //16

// note using hw_timer_t or micros() give similar values
hw_timer_t *Timer1_Cfg = NULL;  // timer object

// pulse timing data
volatile uint64_t riseTime, period;
volatile uint64_t averageFreq = 0, frequency;
// rising edge interrupt calculate period uSec
void IRAM_ATTR rising() {
  uint64_t rise = timerReadMicros(Timer1_Cfg);
  period = rise - riseTime;
  riseTime = rise;
  frequency = 100000000ul / period;
  if (averageFreq == 0) averageFreq = frequency;  // initialize
  else
    averageFreq = (frequency + averageFreq) / 2;  // running average
}


void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.printf("\n\nESP32 frequency running average - measure pin %d pulse information \n", risePin);
  //Timer1_Cfg = timerBegin(0, 80, true);           // API 2.x setup timer for 1uSec
  if ((Timer1_Cfg = timerBegin(10000000)) == NULL)  // API 3.0 setup timer for 1uSec
    Serial.println("timerBegin Failed!!");
  Serial.print("timerBegin() OK frequenmcy ");
  Serial.println(timerGetFrequency(Timer1_Cfg));
  //  setup interrput routines - connect signal to following pins
  attachInterrupt(digitalPinToGPIONumber(risePin), rising, RISING);  // detect rising edge on pin 16
  Serial.println("displaying results");

  // setup CYD TFT display
  Serial.println("\ninitialise TFT");
  // Initializing tft_espi
  tft.init();
  tft.setRotation(1);
  tft.fillScreen(TFT_BLACK);
  tft.setTextSize(3);
}

void loop() {
  static char text[40] = { 0 };
  static unsigned long int timer = millis();
  // if .1 seconds have elapsed since last reading print results
  if (millis() - timer > 100) {
    timer += 100;
    if (text[0] != 0) {  // erase old text ?
      tft.setCursor(0, 0, 2);
      tft.setTextColor(TFT_BLACK, TFT_BLACK);
      tft.println(text);
    }
    // display frequency to serial
    static int i;
    Serial.printf("%d %.1f %.1f\n", i++, frequency / 100.0, averageFreq / 100.0);
    // display frequency to TFT
    sprintf(text, "\n\n   freq %.1fHz   ", averageFreq / 100.0);
    tft.setCursor(0, 0, 2);
    tft.setTextColor(TFT_WHITE, TFT_BLACK);
    tft.println(text);
  }
}

displays frequency on CYD every 100mSec