Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]

Başlatan t2, 18 Eylül 2016, 16:58:34

alicavuslu

Z Hocam zaman düzleminde araya sıfır koyuyoruz ve konvolüsyon işlemi ile işlemleri yapıyoruz.  FFT kısmında ise aslında sonuna ekliyoruz. Fakat FFT simetrik olduğundan doalyı her iki tarafada sıfırlar eklenmek durumundadır. İki değer arasına sıfır koyma durumunda sizin dediğiniz gibi sinüs değerlerinde artış meydana gelir.

z

Bir de biz DAC yada dolaylıyoldan pwm ile DAC  yaptığımızda sıfırıncı dereceden bir tutucu yapmış oluyoruz.

1. dereceden bir tutucu eklense ses kalitesi artarmı?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

alicavuslu


z

Normalde sinyal işleyen digital bloklar hep samplelar (bir an için aktif olan sayısal veriler) üzerinde işlem yapar ve çıkışında gene sample alınmış gibi değerler üretir. En son aşamada DAC gibi birimden veri çıkar ve analoğa dönüşür. Eğer DAC latch tipi olmazsa analog sinyal de sample gibi olur. Fakat latch edilirse sıfırıncı dereceden tutma işlemi (ZOH zero order hold) yapılmış olur.

Artık analog verimiz dörtgen bloklar halindedir.

Daha önce hiç denemedim ama ZOH yerine 1. dereceden tutucu ile DAC verileri tutulursa dikdörtgen veri bloklari üçgen dalga formlarına dönüşür.

Fakat bu işlem zaman domeninde nasıl yapılır fikrim yok. ZOH basit. Sadece DAC önüne Latch koymak yetiyor.

https://en.wikipedia.org/wiki/Zero-order_hold
https://en.wikipedia.org/wiki/First-order_hold
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

alicavuslu

Hocam verdiğiniz linlerden fikir yürütecek olursam zaman domaininde konvolüsyon işlemi yapılıyor diyebilirim...

z

Aslında hep ilgilenmek isteyip de unuttuğum bir konu.

Öğrenciyken hocamız 1. dereceden tutucu nasıl bir işleme denk gelir diye sorduğunda hep bir ağızdan integral işlemi diye cevap vermiştik. Yok değil demişti fakat sonrasını hatırlamıyorum.
Ders notlarında da bir şey bulamadım. Lafta kalan bir konuşma olarak kalmış.

Haa bir de şu aklımda kalmış. İntegratör olsaydı integratör çıkışı sample anlarında sample değerlerine eşit olamaz demişti. Gerçekten de integral alıcı olamaz.

Konvolüsyon olduğuna nasıl karar verdin?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

alicavuslu

Aşağıdaki linkte konvolusyon denklemi mevcut. First order daki ilke eşitliğe baktığınızda aynı olduğunu göreceksiniz.

https://wikimedia.org/api/rest_v1/media/math/render/svg/de7e5972470c44c5b5788bf3372578b5f2363d49

z

Ama o konvolüsyon kısmı sample alma işlemi değilmi?

http://www.cncdesigner.com/wordpress/?p=780

Sample alma işleminin hemen ardından triangular fonksiyondan bahsetmiş.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

alicavuslu

Hocam dediğiniz gibi o kısım örnekleme işlemi için. Açıkçası olayı bende tam kavrayamadım. Aşağıdaki linkte biraz daha detaylı anlatmış. 3. sayfadaki anlatılarnların sonucunda yine işlemin sonu konvolüsyona cıkıyor diye düşünüyorum.

http://web.cecs.pdx.edu/~tymerski/ece452/Chapter3.pdf

t2

verdiğim wav dosya 8bit idi. 16 bite çevirdim.
8khz 16bit örneklerin arasına  birer sıfır ekledim. bu haliyle dalga bozuldu. sonra RC filtre uyguladım.(sanal filtre)
daha önce bunun formülünü elde etmiştim. neticede çıkan dalga biraz  bozuk oldu. kulak tarafından pek sorun algılanmasa da , yeni  sinyal, cool edit ile yapılan upsample gibi olmadı. bir eksiklik var. filtre zayıf kalmış olabilir. üstüste 2 -3 kere geçirdim. yine olmadı.

z hocam konuya vakıf olduğunuz anlaşılıyor(ara gaz) 
şu ilk mesajda bahsettiğim sayfada nasıl bir yöntem izlenmiş siz anlayabildiniz mi?
FFT alıp bazı bileşenleri bir şey yaparak(özel sarım bobin:) )   sonra ters FFT yaparak örneklemeyi 2 kata çıkarıp sinyali güzelleştirmek mümkünmüş.

Gerçekten bu yöntemi kullanan programları denedim güzel yapıyorlar. bazı açık kodlu VC++ projeler de var fakat anlayamadım. Delphi kodu yazabilmem için matematiksel formül lazım. FFT aldık elimizde bir sürü genlik var. (spektrum resmen) bunları ters FFT yapabilme rutini de var. ( para verip aldım)  un var şeker var.. bunları birleştirip güzel UPsample yapabilen uygulamayı yazmamız gerek. 

alicavuslu

RC filtre uygularsanız yaptığınız işlem tabiki olumsuz sonuç verir. Bahsettiğiniz yazılım nedir? Bende denemek istiyorum aldığım sonuçlar ile karşılaştırma yapabilirim.

mesaj birleştirme:: 18 Eylül 2016, 22:31:16

Bu benim olusturdugum dosya...

http://uppit.com/6k1dg2b83rh4

t2

Başarılı çevirme yapabilen  orijinal açık kodlu program wavesurfer:
https://sourceforge.net/projects/wavesurfer/

Orijinal ve başarıyla çevrilmiş yeni sinyaller aşağıdadır.
http://uppit.com/df50qxlrqggc

Acaba sizin matlab kodu yanlış mı yorumladım. Oradaki filtre nasıl davranır? Kaçıncı dereceden?
Band geçiren filtre midir nedir?

Yazılımı kendim yapıyorum. ismi project1.exe delphi ile yazıyorum. Benim yaptığım işlem  8khz örneklerin arasına birer sıfır eklemek suretiyle örnek sayısını 2 katına çıkarmak. Böylece 16khz örneklenmis gibi oluyor.  Sonra RC filtre formülü tatbik ediliyor.   Yeni dalgayı cooledit ile açıp bakıyorum. Güzel olmuyor.

Hocam sizin  çevirme işi de  olmamış.
Araya eklenen sıfırlar aynen görünüyor.
RC filtre ile o sıfırlar gidecek diye düşünmüştüm. o yüzden filtre etmiştim.

bu da sizin sinyal
[IMG]http://i65.tinypic.com/2q3mxx0.jpg[/img]


Şimdi de sizin çevirdiğiniz gibi cooledit programı ile upsample yapılan güzel dalgayı yükledim. buyrun bakın.
http://uppit.com/87qz4eou03ju

Önceki mesajda eklenen resme bakalım, sorunu görelim.
Windows, 8khz olan örnekleme frekansını 16khz yapabilmek için
her bir örneği aynen kopyalamış. Biz ise kopyalamadık fakat sıfır ekledik. ne farkı var? güzellik geldi mi ki?






z

Ara değer = (Önceki + sonraki)/2 hoş olmadı diyorsun ya.

Şöyle yapsan

Bir sinüs sinyalinin 0 ve pi/2 anı önceki ve sonraki samplelarla çakışıyor olsun.

Bu durumda ara değer sinüs sinyalin pi/4 değerine eşit olur.


Örneğin ilk sample değeri 10,  2. sample değeri 40 ise

Burada 30 genlikli i sinüs sinyal var demektir.
Bu durumda ara değer 30*0.707 + 10 olacaktır.

İlk dataların 10 ve 40 iken yeni dataların 10, 31, 40 olacaktır.

Denemesi zor değil.

İlk değer 40, ikinci değer 10 ise ara değer 19 olacak. Bu durumda ilk değer sinüsün tepesi, ikinci değer ise sinüsün sıfır anlamında.

Algoritmayı yazarsın artık.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ferdem

Güzel konu, t2 hocam geçenlerde de benzer konu konuşmuştuk, data istemiştim ama cevap yazamamıştım!

Bölük pörçük etmeden yazabilecek miyim bakalım.

1) Aralara 0 yazıp sonra da bir "lowpass" filtreden geçirsek bu iş olur diyordum. MATLAB in bu işi yapan fonksiyonu interp helpinde şu yazılmış:
http://www.mathworks.com/help/signal/ref/interp.html
Alıntı Yap

1.It expands the input vector to the correct length by inserting 0s between the original data values.

2.It designs a special symmetric FIR filter that allows the original data to pass through unchanged and interpolates to minimize the mean-square error between the interpolated points and their ideal values. The filter used by interp is the same as the filter returned by intfilt.

3.It applies the filter to the expanded input vector to produce the output.
Gördüm ki o filtre sıradan bir filtre değilmiş.

2) Bahsettiğiniz yöntemi araştırdım, alicavuslu hoca da örnek bir kod koymuş.
FFT aldığımızda zamandaki data boyut ne ise FFT sonucunda o kadar katsayı buluruz, IFFT yaptığımızda da aynı şekilde data boyutu değişmez.
Yöntem diyor ki FFT yi al, datanın tam ortasına genişletmek istediğin kadar 0 ekle, sonra IFFT yap. Biz 2 kata çıkarmak istediğimizden orijinal data boyutu kadar 0 ekleyerek sıfır_eklenmiş_FFT buluyoruz, sonra sıfır_eklenmiş_FFT ye IFFT yaptığımızda upsample edilmiş zaman datasına ulaşıyoruz.
Sizin verdiğiniz gibi iyi(?) değil ama yine de fena değil, fikir verir. Sonuç aşağıdaki resimde ifft_mid adındaki datada görülüyor.

Bu şekilde Delphi de deneyebilirsiniz.

Denediğim MATLAB kodu şöyle:
Alıntı Yapfft_result=fft(data); %fft al
reconstructed=ifft(fft_result); %test amacli gor, data ile karsilastirildi, OK
dim=length(data); %boyut
half_dim=round(0.5*dim);
%fft sonucuna genişletmek istedigin boyut kadar 0 ekle, verinin ortasına
%ekle.
fft_result_with_zeroes=[fft_result(1:half_dim); zeros(dim,1); fft_result(half_dim+1:dim)];
reconstructed_new=ifft(fft_result_with_zeroes); % simdi IFFT aldigimizda upsampled halini bulduk
plot(data,'*b');
hold on
plot(real(reconstructed),'r');
plot(real(reconstructed_new),'g');
% reconstructed_new=filter([0.5 0.5],1,reconstructed_new);
wavwrite(reconstructed_new,16000,'ifft_mid')




3) Diğer konular:
a) wav dosya sayılardan ibaret bir dosya, bu dosyayı MATLAB e atıp çizdirirsek MATLAB neyse onu gösteriyor, en fazla dataları düz bir çizgi ile birleştiriyor. Audio programa(audacity, cooledit) atıp baktığımızda "data point" lerin dışında kendinden de bir şeyler katıp bir "waveform" çiziyor, bunu neye göre yapıyor? Mesela uyduruk iş yapmış dediğiniz datada çok net, arka arkaya gelen aynı örnekler arasında salınımlı çizmiş(?), önce bir orayı anlamak lazım.

b) DAC çıkışında "zero order hold-zoh, first order hold-foh" konusu önemli, "zero order hold" dan bir beklenti yok ama "first order hold" bir interpolasyon yaptığından dolayı "upsample" ile düşünülen sonucu sağlayabilir.
ZOH+fazla sample =? FOH+daha az sample.
Sonuçta "staircase" grafiği sürekli grafiğe benzetmek için sık örnek şart ama eğer "staircase" değil de noktalar arasına bir doğru çekebiliyorsak az örnekle de kotarılır.
z hocam zamanda FOH için uygun seçilmiş zaman sabitli RC epey iş görür, gecikme önemsiz, sinyal formu önemli diye düşünüyorum.

t2

Çizme ve ekranda gösterme işi ayrı bir konu. Amacımız örneklerin seviyesini yaklaşık da olsa tutturmak. 
Audacity görüntüsünden de sonuç kalitesi anlaşılabiliyor.

Sizin denediğiniz gayet başarılı olmuş. elinize sağlık. Ekran görüntüsünü eklemeniz de çok ikna edici oldu. Teşekkür ederim. Şimdi bu matlab kodunu Delphi'ye uyarlamaya çalışmalıyım.