#N canvas 316 110 592 515 10;
#X declare -lib iemmatrix;
#X obj 389 427 matrix;
#X msg 11 124 bang;
#X text 46 34 real fft in each matrix row;
#X text 7 60 you can calculate real ffts in column direction \; matrix has to have 2^k columns \; a N/2+1 columns matrix is the result \;;
#X obj 11 191 mtx_cumsum;
#X msg 11 147 1 16;
#X obj 11 169 mtx_ones;
#X obj 11 213 mtx_- 1;
#X obj 49 255 mtx_* 0;
#X floatatom 90 120 5 0 0 0 - - - 0;
#X text 134 118 <-- scroll here to select frequency;
#X obj 117 165 / 8;
#X obj 49 326 t a a;
#X obj 92 326 mtx_print original;
#X text 321 427 see also:;
#X obj 49 280 mtx_cos;
#X obj 117 255 * 3.14159;
#X text 109 280 cosine wave;
#X text 89 15 [mtx_rfft];
#X obj 49 350 mtx_rfft, f 19;
#X obj 389 450 mtx_rifft;
#X obj 90 141 t b f;
#N canvas 450 271 494 171 META 0;
#X text 12 105 AUTHOR IOhannes m zmoelnig;
#X text 12 85 OUTLET_0 matrix;
#X text 12 125 HELP_PATCH_AUTHORS IOhannes m zmölnig;
#X text 12 25 LICENSE GPL-2+;
#X text 12 65 INLET_0 matrix;
#X text 12 5 KEYWORDS control matrix math;
#X text 12 44 DESCRIPTION real-valued FFT for each matrix row;
#X obj 16 147 declare -lib iemmatrix;
#X restore 381 16 pd META;
#X obj 49 404 mtx_print rfft.re;
#X obj 160 404 mtx_print rfft.im;
#N canvas 205 83 207 172 pi 0;
#X obj 38 16 loadbang;
#X msg 38 39 1 1;
#X obj 38 62 atan2;
#X obj 38 85 * 4;
#X obj 38 108 outlet;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
#X connect 2 0 3 0;
#X connect 3 0 4 0;
#X restore 181 255 pd pi;
#X obj 389 474 rfft~;
#N canvas 0 0 545 402 ~ 0;
#X obj 74 80 inlet mtx;
#X obj 343 208 array define \$0.orig~;
#N canvas 1067 375 450 300 mtx2table 0;
#X obj 54 93 list split 3;
#X obj 54 32 t a a;
#X obj 94 32 mtx_size;
#X obj 88 119 list split 16;
#X obj 88 146 t l l;
#X obj 115 170 array set \$0.orig~;
#X obj 221 76 array size \$0.orig~;
#X obj 88 197 list length;
#X obj 54 9 inlet;
#X obj 88 220 outlet;
#X obj 261 187 array size \$0.re~;
#X obj 261 207 array size \$0.im~;
#X obj 236 156 t f f;
#X obj 163 76 t f f f;
#X obj 236 132 + 1;
#X obj 236 109 >> 1;
#X connect 0 1 3 0;
#X connect 1 0 0 0;
#X connect 1 1 2 0;
#X connect 2 1 13 0;
#X connect 3 0 4 0;
#X connect 4 0 7 0;
#X connect 4 1 5 0;
#X connect 7 0 9 0;
#X connect 8 0 1 0;
#X connect 12 0 11 0;
#X connect 12 1 10 0;
#X connect 13 0 3 1;
#X connect 13 1 15 0;
#X connect 13 2 6 0;
#X connect 14 0 12 0;
#X connect 15 0 14 0;
#X restore 74 139 pd mtx2table;
#X obj 112 212 tabreceive~ \$0.orig~;
#X obj 112 235 rfft~;
#X obj 112 258 tabsend~ \$0.re~;
#X obj 222 258 tabsend~ \$0.im~;
#X obj 343 240 array define \$0.re~;
#X obj 343 260 array define \$0.im~;
#X msg 74 160 set \$1 \, bang;
#X obj 74 184 switch~;
#X obj 61 342 array get \$0.re~;
#X obj 61 292 bang~;
#X obj 61 315 t b b;
#X obj 182 341 array get \$0.im~;
#X obj 61 365 print rfft~re;
#X obj 182 365 print rfft~im;
#N canvas 735 461 450 300 DSP? 0;
#X obj 83 102 inlet;
#X obj 83 125 spigot;
#X obj 83 148 outlet;
#X obj 134 113 r pd;
#X obj 134 136 route dsp;
#X text 86 64 only calculate if DSP is on...;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
#X connect 3 0 4 0;
#X connect 4 0 1 1;
#X restore 74 110 pd DSP?;
#X text 75 25 calculate the rFFT using Pd's built-in [rfft~] object;
#X text 74 50 (this patch only works if DSP is *on*);
#X connect 0 0 17 0;
#X connect 2 0 9 0;
#X connect 3 0 4 0;
#X connect 4 0 5 0;
#X connect 4 1 6 0;
#X connect 9 0 10 0;
#X connect 11 0 15 0;
#X connect 12 0 13 0;
#X connect 13 0 11 0;
#X connect 13 1 14 0;
#X connect 14 0 16 0;
#X connect 17 0 2 0;
#X restore 336 321 pd ~;
#X obj 49 303 t a a;
#X text 375 323 <- using [rfft~];
#X connect 1 0 5 0;
#X connect 4 0 7 0;
#X connect 5 0 6 0;
#X connect 6 0 4 0;
#X connect 7 0 8 0;
#X connect 8 0 15 0;
#X connect 9 0 21 0;
#X connect 11 0 16 0;
#X connect 12 0 19 0;
#X connect 12 1 13 0;
#X connect 15 0 28 0;
#X connect 16 0 8 1;
#X connect 19 0 23 0;
#X connect 19 1 24 0;
#X connect 21 0 1 0;
#X connect 21 1 11 0;
#X connect 25 0 16 1;
#X connect 28 0 12 0;
#X connect 28 1 27 0;
