<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FxDev &#124; ße Different Everytime! &#187; matematik</title>
	<atom:link href="http://www.fxdev.org/etiket/matematik/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fxdev.org</link>
	<description>FxDev &#124; This Evolution is Revolution</description>
	<lastBuildDate>Wed, 01 Feb 2012 22:16:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>MATLAB&#8217;in Küçük Kardeşi: SpeQ</title>
		<link>http://www.fxdev.org/matlabin-kucuk-kardesi-speq/</link>
		<comments>http://www.fxdev.org/matlabin-kucuk-kardesi-speq/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 16:18:19 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[İnceleme]]></category>
		<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[çizme]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[grafik]]></category>
		<category><![CDATA[graphic]]></category>
		<category><![CDATA[hesap]]></category>
		<category><![CDATA[m]]></category>
		<category><![CDATA[makinesi]]></category>
		<category><![CDATA[matematik]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[mathematics]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[polinom]]></category>
		<category><![CDATA[programı]]></category>
		<category><![CDATA[speq]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=1137</guid>
		<description><![CDATA[Elektrik veya Elektronik ile ilgilenmiş herkes hayatında bir kez dahi olsa MATLAB adını duymuş, üzerinde projeler geliştirmiş, programlar yazıp, algoritmalar koşturmuştur. Toolbox&#8217;ları ve sunduğu bir çok ek özelliği ile MATLAB&#8217;in matematik konusunda dünyaca kabul görmüş bir program olduğunu söylemek sanırım yanlış olmaz. Yalnız biz kullanıcıları ve özellikle ticaret ile uğraşanları rahatsız eden ve elbette her [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox" title="Continuous to Discrete" href="http://www.fxdev.org/wp-content/uploads/2011/01/Cont.to_.Disc.png"><img class="alignright size-full wp-image-905" title="Continuous to Discrete" src="http://www.fxdev.org/wp-content/uploads/2011/01/Cont.to_.Disc.png" alt="" width="250" height="200" /></a>Elektrik veya Elektronik ile ilgilenmiş herkes hayatında bir kez dahi olsa MATLAB adını duymuş, üzerinde projeler geliştirmiş, programlar yazıp, algoritmalar koşturmuştur. Toolbox&#8217;ları ve sunduğu bir çok ek özelliği ile MATLAB&#8217;in matematik konusunda dünyaca kabul görmüş bir program olduğunu söylemek sanırım yanlış olmaz.</p>
<p>Yalnız biz kullanıcıları ve özellikle ticaret ile uğraşanları rahatsız eden ve elbette her güzel programın sahip olduğu &#8220;ücret ve lisans&#8221; söz konusu olduğunda MATLAB de bu engele takılmaktadır. <span id="more-1137"></span>Her ne kadar yüksek bir ücretlendirmeye sahip olmasa da (öğrenciler için Aralık 2011 itibariyle MATLAB 89$ + Toolbox başına 29$) bazı işlemlerde (grafik çizim, matrissel işlemler) sahip olduğu üstünlük onu kullanmamızı zorunlu kılar. Peki MATLAB dışında, ona benzer programlar yok mudur diye soracak olduğunuzda ise aklıma Excel&#8217;den başka program gelmemektedir ve ne yazık ki o da ücretlidir.</p>
<p>İşte tam bu anda yardımımıza <strong>SpeQ Mathematics</strong> isimli program koşacaktır. Program bence boyutu itibari ile gayet başarılı işler çıkarmaktadır. MATLAB&#8217;ın en çok kullandığımız özelliği olan .m file şeklinde özel dosya yaratma, yapılan işlemleri kaydetme, değişkenlere atama yapma ve bunları daha sonra kullanma gibi standart uygulamaların altından SpeQ oldukça başarılı şekilde kalkmaktadır. Bunun yanında basit anlamda grafik çiziminin de başarılı bir başka özelliği olduğunu söylemem gerek.</p>
<p>Daha öncede belirttiğim gibi <strong>SpeQ</strong> gigabyte büyüklüğündeki abisi MATLAB&#8217;e göre biraz küçük bir boyutta: <strong>746kByte</strong>. <a href="http://www.speqmath.com/files/speq.zip" target="_blank"><strong>Buradan</strong></a> veya <a href="http://www.4shared.com/file/S5P1Jh0P/speq.html" target="_blank"><strong>buradan</strong></a> indirebileceğiniz programın arayüzü ise aşağıdaki gibi ve oldukça sade.<br />
<a class="lightbox" title="SpeQ Ana Ekran" href="http://www.fxdev.org/wp-content/uploads/2011/12/speq_mainscreen.png"><img class="aligncenter size-full wp-image-1139" title="SpeQ Ana Ekran" src="http://www.fxdev.org/wp-content/uploads/2011/12/speq_mainscreen.png" alt="" width="567" height="409" /></a>MATLAB kullanıcıların en büyük şikayetlerinden biri de ilk açılış süresinin oldukça fazla vakit almasıdır. <strong>SpeQ</strong>&#8216;in açılış süresi ise bilgisayarınızdaki hesap makinesini açmaktan farksızdır. Bu yönüyle ben çoğu işimde Windows&#8217;un kendi hesap makinesini kullanmak yerine <strong>SpeQ</strong>&#8216;i tercih ediyorum. <strong>SpeQ</strong> ile yaptığım küçük bir hesaplamayı aşağıdaki fotoğraftan görebilirsiniz. Farkedeceğiniz üzere yazım tekniği MATLAB ile neredeyse aynı.<a class="lightbox" title="kullanim" href="http://www.fxdev.org/wp-content/uploads/2011/12/kullanim.png"><img class="aligncenter size-full wp-image-1140" title="kullanim" src="http://www.fxdev.org/wp-content/uploads/2011/12/kullanim.png" alt="" width="583" height="357" /></a></p>
<p><strong>SpeQ&#8217;</strong>in bir diğer güzelliği ise fonksiyonlarının az olmasından kaynaklanan yardım ara birimidir. &#8220;<strong><em>Functions</em></strong>&#8221; bölmesinde istediğiniz fonksiyonu aratabilir ya da çift tık ile istediğiniz fonksiyonu çalışma alanına ekleyebilirsiniz. Çizim konusunda ise temel bir kullanım veren <strong>SpeQ</strong> bu konuda çoğu kişiyi tatmin etmeyebilir. Yalnız çizim üzerinde değişikliklerin hızlı yapılabilmesi SpeQ için bir artı. Aşağıda 1k direnç ve 1000uF kapasitörün 10V ile dolum ve boşalım eğrilerini görebilirsiniz.<a class="lightbox" title="SpeQ Grafik" href="http://www.fxdev.org/wp-content/uploads/2011/12/grafik.png"><img class="aligncenter size-full wp-image-1141" title="SpeQ Grafik" src="http://www.fxdev.org/wp-content/uploads/2011/12/grafik.png" alt="" width="546" height="385" /></a></p>
<p>Yukarıdaki çizime ait fonksiyon yazımını aşağıdan kopyala/yapıştır ile çalışma alanına atıp F5 tuşuna basmanız yeterlidir.</p>
<pre class="brush: c;;">closeall;

R=1000;		'Direnç Degeri'
C=1000e-6;	'Kapasitör De?eri'
to=R*C;		'Zaman sabiti'
V=10;		'Gerilim'

f1(x)=10-10*e^-(x/to)	'Kapasitör dolum fonksiyonu'
	Function f1(x) is defined
f2(x)=10*e^-(x/to)		'Kapasitör bosalim fonksiyonu'
	Function f2(x) is defined
Plot(f1(x),f2(x))		'Grafik çizdiriliyor'
	Plot done
'Grafik üzerindeki özellikler ayarlanıyor'
yMax=20;
yMin=-2.5;
xMax=10;
xMin=-1.5;
xLabel="Time";
yLabel="Voltage";</pre>
<p>Sonuç olarak yukarıda bahsettiğim türden işlemler için oldukça güzel ve ücretsiz olan programın eksikleri olmakla beraber (matrissel işlemler gibi) eklenecek bir kaç özellikle, el altında sıklıkla tercih edilecek başarılı bir program olacağını söylemek sanırım yanlış olmaz.</p>
<p>Programın diğer ek özelliklerini keşfetmeyi size bırakarak herkese çalışmalarında başarılar dilerim.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/matlabin-kucuk-kardesi-speq/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/matlabin-kucuk-kardesi-speq/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Teoriden Gerçeğe: Goertzel Algoritması (Vol. I)</title>
		<link>http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-i/</link>
		<comments>http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-i/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 01:39:35 +0000</pubDate>
		<dc:creator>FxDev</dc:creator>
				<category><![CDATA[Mühendislik]]></category>
		<category><![CDATA[adc]]></category>
		<category><![CDATA[algoritma]]></category>
		<category><![CDATA[algoritması]]></category>
		<category><![CDATA[ansi]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[dtmf]]></category>
		<category><![CDATA[fft]]></category>
		<category><![CDATA[frekans]]></category>
		<category><![CDATA[genlik]]></category>
		<category><![CDATA[goertzel]]></category>
		<category><![CDATA[matematik]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[modülasyon]]></category>
		<category><![CDATA[örnekleme]]></category>
		<category><![CDATA[teori]]></category>

		<guid isPermaLink="false">http://www.fxdev.org/?p=893</guid>
		<description><![CDATA[Ülkemizde özellikle &#8216;kopyala-yapıştır programcılık&#8217; mantığıyla çalışan kişi sayısının artmasından bıkan biri olarak, özellikle bir işin nasıl olması gerektiğine kendimce bir yanıt vermeyi amaçladığım bu yazı dizimde, final döneminde rastladığım, kısa notlar ve örneklerle pekiştirdiğim Goertzel algoritmasına değineceğim. Kısaca değinmek gerekirse, Dr. Gerald Goertzel’in 1958 yılında yayınladığı Goertzel algoritması sinyalin içerisindeki frekans bileşenlerini çözen dijital sinyal [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox"  title ="Continuous to Discrete" href="http://www.fxdev.org/wp-content/uploads/2011/01/Cont.to_.Disc.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Cont.to_.Disc.png" alt="" title="Continuous to Discrete" width="250" height="200" class="alignright size-full wp-image-905" /></a>Ülkemizde özellikle &#8216;kopyala-yapıştır programcılık&#8217; mantığıyla çalışan kişi sayısının artmasından bıkan biri olarak, özellikle bir işin nasıl olması gerektiğine kendimce bir yanıt vermeyi amaçladığım bu yazı dizimde, final döneminde rastladığım, kısa notlar ve örneklerle pekiştirdiğim Goertzel algoritmasına değineceğim.</p>
<p>Kısaca değinmek gerekirse, Dr. Gerald Goertzel’in 1958 yılında yayınladığı Goertzel algoritması sinyalin içerisindeki frekans bileşenlerini çözen dijital sinyal işleme tekniğidir. Temel FFT algoritması tanımlı bir bant aralığındaki frekans bileşenlerini bizlere sunarken Goertzel algoritması sadece belirlenen, spesifik frekans bileşenlerini bizlere sunmaktadır.<span id="more-893"></span></p>
<p>Algoritmanın matematiksel ifadesi aşağıdadır:</p>
<p><a class="lightbox"  title ="Goertzel Algoritması Teorik" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik.jpg" alt="" title="Goertzel Algoritması Teorik" width="300" height="129" class="aligncenter size-full wp-image-895" /></a><br />
Durum diyagramı:<a class="lightbox"  title ="Goertzel Algoritması Durum Diyagramı" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-2.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-2.png" alt="" title="Goertzel Algoritması Durum Diyagramı" width="380" height="329" class="aligncenter size-full wp-image-896" /></a><br />
<strong>a) Örnekleme Oranı</strong><br />
Goertzel algoritmasında, aynen FFT’de olduğu gibi, örnekleme frekansı, belirlenmesi istenen frekansların en büyüğünün en az iki katı olmalıdır.<br />
<a class="lightbox"  title ="Goertzel Algoritması Örnekleme Frekansı" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-3.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-3.jpg" alt="" title="Goertzel Algoritması Örnekleme Frekansı" width="122" height="29" class="aligncenter size-full wp-image-897" /></a></p>
<p><strong>b) Blok Boyutu</strong><br />
Goertzel blok boyutu N aynı FFT’de olduğu gibi filtre sonucunda çıkacak frekans çözünürlüğüne etki eder. Blok boyutunu N ile temsil edersek frekans çözünürlüğü aralığı fs/N olacaktır. Örneğin örnekleme frekansı fs=8kHz, filtre uzunluğu N=100 seçilirse sonuçta çıkacak frekans çözünürlüğü 80Hz olacaktır.<br />
Blok boyutunu büyük seçmek, özellikle düşük frekans bileşenlerinin daha iyi kararlılıkla belirlenmesine yol açsa da büyük seçilen blok boyutu Goertzel algoritması hesaplamasını bir o kadar uzatacaktır. Dolayısıyla blok boyutu seçiminde bu iki kriter göz önüne alınarak optimum seçimin yapılması gerekmektedir. Son olarak seçilecek olan N değeri, FFT’nin aksine, 2’nin katları olmak zorunda değildir.</p>
<p><strong>c) Sabitler</strong><br />
Goertzel algoritmasını hesaplamadan önce Goertzel algoritmasının kullanacağı katsayıları hesaplamak işlemler sırasında algoritma çözümüne hız kazandıracaktır.<br />
<a class="lightbox"  title ="Goertzel Algoritması Katsayılar" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-4.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-4.jpg" alt="" title="Goertzel Algoritması Katsayılar" width="233" height="89" class="aligncenter size-full wp-image-898" /></a>Yukarıdaki katsayılar her bir tespit edilecek frekans için ayrı ayrı bulunur. Yukarıdaki N sayısı blok boyutunu temsil etmektedir.</p>
<p><strong>d) Temel Goertzel</strong><br />
Temel Goertzel algoritması DFT ve FFT’de olduğu gibi geriye sanal frekans bileşenlerini sunar. Genlik ve faz bilgileri geriye dönen bu sanal bileşenlerden yola çıkılarak hesaplanabilir.<br />
Geortzel algoritması hesabında Q0, Q1 ve Q2’den oluşan 3 değişken sürekli hesaplanmak zorundadır.<br />
Bu değişkenlerin başlangıç değerleri sıfır olmak koşuluyla Goertzel algoritması aşağıdaki gibi yazılabilir.<br />
<a class="lightbox"  title ="Q0,Q1 ve Q2 Değişken Hesaplamaları" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-5.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-5.jpg" alt="" title="Goertzel Algoritması Teorik-5" width="278" height="68" class="aligncenter size-full wp-image-899" /></a>                                                   </p>
<p>Yukarıdaki denklemler N kez tekrarlanır.<br />
Daha sonra ortaya çıkan Q0, Q1 ve Q2 sayıları aşağıdaki denklemlerde kullanılır.<br />
<a class="lightbox"  title ="Temel Goertzel Algoritması" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-6.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-6.png" alt="" title="Temel Goertzel Algoritması" width="314" height="130" class="aligncenter size-full wp-image-900" /></a>                             Yine bu denklemler belirlenecek frekans sayısı kadar tekrarlanarak her bir frekans için genlik değeri bulunmuş olur.</p>
<p><strong>e) Optimize Edilmiş Goertzel</strong><br />
Optimize edilmiş Goertzel algoritması faz açıları yerine sadece genliklere odaklanır ve temel Goertzel algoritmasından daha az işlem yapılmasını sağlar.<br />
Q0, Q1 ve Q2 katsayıları hesaplandıktan sonra temel Goertzel’den farklı olarak yapılması gereken tek işlem;<br />
<a class="lightbox"  title ="Genlik Hesabı I" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-7.png"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-7.png" alt="" title="Goertzel Algoritması Teorik-7" width="323" height="41" class="aligncenter size-full wp-image-901" /></a>Mikrodenetleyiciler ile bu işlem yapılırken genliği büyük olan işleme alınacaksa karekök alma işlemine gerek yoktur. Dolayısıyla buradan denklem aşağıdaki forma dönüşür.<a class="lightbox"  title ="Genlik Hesabı II" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-8.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Algoritması-Teorik-8.jpg" alt="" title="Goertzel Algoritması Teorik-8" width="313" height="29" class="aligncenter size-full wp-image-902" /></a></p>
<p><strong>f) FFT ve Goertzel Algoritmasının Karşılaştırılması</strong><br />
Yüksek sayıda örnek için FFT her ne kadar avantajlı gözükse de Goertzel düşük sayıda frekansı çözümlemek için FFT’den daha hızlıdır. Genel anlamda N blok boyutu için FFT <em>N(log2)N</em> Goertzel <em>(5/6)(log2)N</em> kadar işlem yapmaktadır.</p>
<p><strong>g) Matlab Uygulaması</strong><br />
Goertzel algoritması için her ne kadar Matlab kendi fonksiyonunu barındırsa da yukarıdaki denklemleri kullanarak yazdığımız .m kodlarını aşağıda görebilirsiniz. Aşağıdaki kodlardan da görülebileceği üzere DTMF keypad tuşlarından 3 örneklenmiştir.</p>
<pre class="brush: c; highlight: [9,31,35];">% Yazar: Fırat DEVECİ
% Konu : Goertzel Algoritması

clear all;
Fs   = 4000;           % Örnekleme frekansı
n=0:1/Fs:0.1;           % Örnek
Goertzel_N=length(n);   % Goertzel örnek sayısı

freq=[697, 770, 852, 941, 1209, 1336, 1477, 1633];  % Bulmak istediğimiz frekans bileşenleri
Bins=length(freq);                                  % Kaç adet frekans bulacağımız bilgisi
samples=sin(2*pi*697*n)+sin(2*pi*1477*n);           % Örneklediğimiz sinyal
sound(samples);                                     % Ses çalınıyor

for i=1:Bins                            % Goertzel katsayıları hesaplanıyor
    k(i)=(0.5+(Goertzel_N*freq(i))/Fs);
    coeffs(i)=2*cos(2*pi*k(i)/Goertzel_N)
end

prev1=[zeros(Bins)];
prev2=[zeros(Bins)];

for i=1:Goertzel_N                      % Hangi frekansın baskın olduğu bulunuyor
    for j=1:Bins                        % Goertzel algoritması
        val=coeffs(j)*prev1(j)-prev2(j)+samples(i);
        prev2(j)=prev1(j);
        prev1(j)=val;
    end
end

for i=1:Bins                            % Genlikler bulunuyor
    magnitude(i)=sqrt((prev1(i)*prev1(i)+prev2(i)^2)-(coeffs(i)*prev1(i)*prev2(i)));
end

freq_indices = round(freq/Fs*Goertzel_N)+1;
dft_data = goertzel(samples,freq_indices);

subplot(3,1,1);
plot(n,samples);
title('Sinyal Şekli');
subplot(3,1,2);
stem(freq,abs(magnitude));              % Ekrana basılıyor
set(gca,'xtick',freq);
xlabel('Hz');
ylabel('Magnitude');
title('Kendi Goertzel Algoritmamızın Yanıtı');
subplot(3,1,3);
stem(freq,abs(dft_data));
set(gca,'xtick',freq);
xlabel('Hz');
ylabel('Magnitude');
title('Matlab Goertzel Algoritmasının Yanıtı');</pre>
<p>Yukarıdaki kod işletildiğinde ekrana aşağıdaki şekil (üzerine tıklarsanız büyür) ortaya çıkmaktadır. Görüldüğü üzere kendi yazdığımız optimum Goertzel algoritması oldukça sağlıklı sonuç vermektedir.<a class="lightbox"  title ="Goertzel Algoritması Matlab Çıktısı" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Matlab.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-Matlab.jpg" alt="" title="Goertzel Algoritması Matlab Çıktısı" width="600" height="310" class="aligncenter size-full wp-image-903" /></a><br />
<strong>h) ANSI C Uygulaması</strong><br />
Yukarıda Matlab için yaptığımız uygulamayı ANSI C ortamına taşırsak aşağıdaki kod öbeğine ulaşmış oluruz.</p>
<pre class="brush: c; highlight: [16,95];">/*
Yazar: Fırat DEVECİ
Konu : Goerzel Algoritması
*/

#include "stdio.h"
#include "stdlib.h"
#include "math.h"

#define Fs              4000            // Örnekleme frekansımız, izleyeceğimiz en yüksek frekans değerinin en az iki katı olmalı
#define BINS            8               // 8 temel frekans izlenecek
#define Pi              3.141592654     // Pi sayısı tanımlanıyor
#define GOERTZEL_N      128             // 128 örnek alınacak
#define Level_Segment   8

const int   freqs    [BINS] = {697, 770, 852, 941, 1209, 1336, 1477, 1633};
float       samples  [GOERTZEL_N];

float       coeffs   [BINS];
float       prev1    [BINS];
float       prev2    [BINS];
float       magnitude[BINS];
int         levels   [BINS];
float       n        [GOERTZEL_N];

unsigned char sample_counter    = 0;
unsigned char sample_complete   = 0;

// Goertzel için katsayılar hesaplanıyor

void coefficient(void)
{
    unsigned int k, i;
    for(i=0;i < BINS;i++)
    {
        k           =(unsigned int)(0.5 + (float)GOERTZEL_N * freqs[i] / Fs);
        coeffs[i]   = 2.0 * cos(2.0 * Pi * ((float)k/GOERTZEL_N));
    }

}

int goertzel(void)
{
    int big =0,
        i   =0;
    float val = 0,
          max = 0;

    // Geçici dizilerin içerisi temizleniyor
    for(i=0;i < BINS;i++)
    {
        prev2[i]=0;
        prev1[i]=0;
    }

    // GOERTZEL Algoritması işletiliyor
    for(sample_counter=0;sample_counter < GOERTZEL_N; sample_counter++)
    {
        for(i=0;i < BINS;i++)
        {
            val     = coeffs[i] * prev1[i] - prev2[i] + (float)samples[sample_counter];
            prev2[i]= prev1[i];
            prev1[i]= val;
        }
    }

    // Genlikler belirleniyor
    for(i=0;i < BINS;i++)
    {
        magnitude[i] = (prev1[i] * prev1[i]) + (prev2[i] * prev2[i]) - (coeffs[i] * prev1[i] * prev2[i]);
        if(magnitude[i] > max)
        {
            max=magnitude[i];
            big=i;
        }
    }

    for(i=0;i < BINS;i++)
    {
        levels[i]=(int)(Level_Segment*(float)(magnitude[i]/max));
    }

    return big;
}

int main()
{
    int i,buyuk;
    float a;
    coefficient();

    for(i=0;i < GOERTZEL_N;i++)
        samples[i]=sin(2*Pi*697*i/4000)+sin(2*Pi*1477*i/4000);

    buyuk=goertzel();

    printf("Yazar: Firat DEVECI\n");
    printf("Konu : Goertzel Algoritmasi\n\n");
    printf("En Buyuk Genlik: %d\n\n",buyuk);
    printf("Frekanslar      Katsayilar      Goertzel Sonucu\n");

    for(i=0;i < BINS;i++)
    {
        if(i==buyuk)
            printf("%d\tHz -    %f\t -  %d*\n",freqs[i],coeffs[i],levels[i]);
        else
            printf("%d\tHz -    %f\t -  %d\n",freqs[i],coeffs[i],levels[i]);

    }

        getch();
}</pre>
<p>Yukarıdaki kodlar herhangi bir C (Code Blocks vb.) derleyicide derlendiğinde aşağıdaki çıktı ekranı ile karşılaşılır.<a class="lightbox"  title ="Goertzel Algoritması ANSI-C" href="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-ANSI-C.jpg"><img src="http://www.fxdev.org/wp-content/uploads/2011/01/Goertzel-ANSI-C.jpg" alt="" title="Goertzel Algoritması ANSI-C" width="394" height="193" class="aligncenter size-full wp-image-904" /></a><strong>Sonuç</strong><br />
Goertzel algoritması yukarıdaki örneklerden de görüleceği üzere anlaşılması kolay, FFT'ye göre oldukça hızlı ve özellikle düşük güçteki mikrodenetleyiciler ile kolaylıkla kullanılabilecek yapıdadır. Özellikle DTMF kod çözümleme uygulamalarında tercih edilmesinin altında bu yatmaktadır.</p>
<p>Gelecek bölüm: <em>Goertzel algoritmasının mikrodenetleyici ile gerçeklenmesi.</em></pre>
<div name="googleone_share_1" style="position:relative;z-index:5;float: left; margin-right: 290px;"><g:plusone size="standard" count="1" href="http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-i/">{lang: 'tr'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-i/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

