LINUX.ORG.RU

[python] FFT

 


0

0

Раньше с питоном никогда не сталкивался, но тут возникла необходимость модифицировать один исходничек на нём, требуется сделать вывод частоты приходящей в звуковую карту синусоиды. Сигнал записывается следующим образом:

N = jack.get_buffer_size()
output = numpy.zeros((1,N), 'f')
capture = numpy.zeros((1,int(Samplerate*sec)), 'f')

while i < capture.shape[1] - N:
    jack.process(output, capture[:,i:i+N])

Записывается всё успешно. Далее я попытался прикрутить такой код

for i in range(0, capture.shape[1] - N, N) :
    x = rfft(capture[0,i:i+N])
    x = map(lambda c : math.sqrt(c.real*c.real + c.imag*c.imag), x)
    for j, xj in enumerate(x) :
        if xj > 0: 
            print j, " : ", xj

но на выходе, как и ожидалось, получается ересь. Подскажите пожалуйста как правильно получить частоту сигнала.

★★★★★

o main got! FFT на питоне!.. всё, шок прошел

каков диапазон входных частот? попробуй сгенери сигнал любой частоты какой-нибудь программой или сам запиши и протестируй сначала насколько корректно оно идеальный сигнал распознает

и только после этого я бы двигался дальше

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

o main got! FFT на питоне!.. всё, шок прошел

Интересно, как долго будет проходить у тебя шок, если ты посмотришь на gnuradio ;-)

vga ★★
()
Ответ на: комментарий от mclaudt

> performance-critical signal processing path is implemented in C++ using processor floating point extensions

Ну да, и fft в Питоне тоже реализовано либой на Си. Сюрприз?

tailgunner ★★★★★
()
Ответ на: комментарий от mclaudt

Ну написать то могли, но только там бы мало что заработало тогда. А некритичные части, подобные тому, что у ТС, написаны на питоне, вот например:

     fft_window = window.blackmanharris(fft_size)
        fft = self._fft_block[0](fft_size, True, fft_window)
        window_power = sum(map(lambda x: x*x, fft_window))

        c2mag = gr.complex_to_mag(fft_size)
        self._avg = gr.single_pole_iir_filter_ff(1.0, fft_size)
        self._log = gr.nlog10_ff(20, fft_size,
                                 -10*math.log10(fft_size)              # Adjust for number of bins
                                 -10*math.log10(window_power/fft_size) # Adjust for windowing loss
                                 -20*math.log10(ref_scale/2))          # Adjust for reference scale
        self.connect(self, self._sd, fft, c2mag, self._avg, self._log, self)

Тут ребята недавно на js клепали визуализацию звука под браузер, и ничего, работало как-то. Правда потом таки fft перенесли в native, чтоб картинки покрасивее сделать можно было.

vga ★★
()
Ответ на: комментарий от vga

>frequency = (Samplerate/N) * j

Спасибо, это именно то, чего мне и не хватало =)

kranky ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.