raspberry pi 1でtensrorflow lite その24


概要

raspberry pi 1でtensorflow liteやってみた。
マイク入力を扱うので、alsaを叩いてみた。
ラズパイで、リアルタイム処理してみた。
波形を表示してみた。

写真

サンプルコード

#include <gtkmm/drawingarea.h>
#include <ctime>
#include <cmath>
#include <cairomm/context.h>
#include <glibmm/main.h>
#include <gtkmm/application.h>
#include <gtkmm/window.h>
#include <stdio.h>
#include <alsa/asoundlib.h>

#define IN_FREQ             44100

class Clock: public Gtk::DrawingArea
{
public:
    Clock();
    virtual ~Clock();
protected:
    bool on_draw(const Cairo::RefPtr<Cairo::Context> &cr) override;
    bool on_timeout();
    double m_radius;
    double m_line_width;
    int err;
    int i;
    snd_pcm_t * in_handle;
    snd_pcm_sframes_t frames;
    char * device = "default";
    short in_buffer[IN_FREQ * 5];
};
Clock::Clock(): m_radius(0.42), m_line_width(0.05)
{
    Glib::signal_timeout().connect(sigc::mem_fun(* this, &Clock::on_timeout), 1000);
    if ((err = snd_pcm_open(&in_handle, device, SND_PCM_STREAM_CAPTURE, 0)) < 0)
    {
        fprintf (stderr, "Capture open error: %s\n", snd_strerror(err));
    }
    if ((err = snd_pcm_set_params(in_handle, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 1, IN_FREQ, 1, 1000 * 1000)) < 0)
    {
        fprintf (stderr, "Capture open error: %s\n", snd_strerror(err));
    }
}
Clock::~Clock()
{
    snd_pcm_close(in_handle);
}
bool Clock::on_draw(const Cairo::RefPtr<Cairo::Context> &cr)
{
    Gtk::Allocation allocation = get_allocation();
    const int width = allocation.get_width();
    const int height = allocation.get_height();
    cr->set_line_width(1);
    int w;
    for (int i = 0; i < 10; i++)
    {

    }
    frames = snd_pcm_readi(in_handle, in_buffer, IN_FREQ);
    if (frames < 0)
    {
        frames = snd_pcm_recover(in_handle, frames, 0);
    }
    cr->move_to(0, 200);
    for (i = 0; i < 44000; i += 60)
    {
        w = (int) (in_buffer[i] / 256.) + 128.;
        cr->line_to(i / 60, w);     
    }
    cr->stroke();
    return true;
}
bool Clock::on_timeout()
{
    auto win = get_window();
    if (win)
    {
        Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height());
        win->invalidate_rect(r, false);
    }
    return true;
}
int main(int argc, char ** argv)
{
    auto app = Gtk::Application::create(argc, argv, "com.ohisamallc");
    Gtk::Window win;
    win.set_title("alsa");
    win.set_default_size(800, 300);
    Clock c;
    win.add(c);
    c.show();
    return app->run(win);
}



以上。