Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: t2 - 18 Eylül 2016, 16:58:34

Başlık: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 18 Eylül 2016, 16:58:34
(https://ccrma.stanford.edu/~jos/resample/img1.png)
Sinyalleri yazılımsal olarak  yeniden örnekleme (http://dspguru.com/dsp/faqs/multirate/resampling)  (upsample, resample) yapmak mümkün.
http://dspguru.com/dsp/faqs/multirate/resampling (http://dspguru.com/dsp/faqs/multirate/resampling)

Örneğin 8khz ses dosyasını 16khz örneklenmiş yüksek kaliteli kayıt gibi yapmak istersek, her örneği kopyalıyoruz. bu şekilde 16khz dosya elde ediliyor. Windows, aynen  bu şekilde uyduruk dönüşüm yapıyor. 

Biraz daha iyisi, önceki ve sonraki örneği toplayıp ikiye bölmek araya yeni örnek olarak eklemektir.  fakat yine uyduruk oluyor.

Fakat pofesyonel ses işleme programları bu işi daha güzel yapıyor.  işin aslı Fourier transformu ile yeniden dalga oluşturmak imiş. fakat nasıl yapıldığını anlayamadım.


Aşağıdaki sayfada anlatılmış. anlayıp da izah ediverirseniz hep beraber öğrenmiş oluruz

https://ccrma.stanford.edu/~jos/resample/ (https://ccrma.stanford.edu/~jos/resample/)


pdf olarak indir:

https://ccrma.stanford.edu/~jos/resample/resample.pdf (https://ccrma.stanford.edu/~jos/resample/resample.pdf)


Dalgayı Fourier  transformu yaptık . elimizde her frekans için genlik değerleri var. bunları nasıl işleyeceğiz.? hangilerini atlayıp hangilerini toplayacağız ki yeni ve yüksek örnekleme değierine sahip diziyi elde edelim?

Bir seferlik iş olsa ses işleme programları ile yapılır. fakat program içerisine gömmek istiyorum.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 17:07:33
Interpolasyon filtreyi araştırmanızı öneririm. Bahsettiğiniz işlemleri zaman düzleminde yapmanızı sağlıyor.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 18 Eylül 2016, 17:19:15
Belirttiğim sayfada anlatılıyor da ben anlayamadım.
Fourier transformu yapabilecek  kod parçacıklarını temin ettim. spektrum elde edebiliyorum. bu genlik değerlerini öyle bir işlemden geçireceğiz ki yeniden örneklemiş gibi başka bir dalga elde edilecek. Tüm frekans bileşenlerini toplarsak galiba dalganın kendisini aynen elde ediyoruz. zaten Fourier transformu mantığı budur. Bir sinyal yüksek frekanslı sinüs dalgaların toplamından oluşuyor. Yüksek frekanslı dalgalar elimizde var diyelim. örnekleme ile alakasını nasıl oluşturacağız?   
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 18:00:11
FFT kullanarak yapılacak işlem sırasına ait MATLAB kodları aşağıdadır.

İlk şekil 16 ile orneklenmiş 1 Hz lik sinüs diğeri ise 32 ile örneklemiş 1 Hzlik sinüsü göstermektedir.

FFT ile bu işlemleri yapafcaksanız overlap olayınıda araştırmanız gerekmektedir.


clc, clear all, close all;

f_s = 16;
f_g = 1;

n_t = 1 : 16;

Giris = sin(2 * pi * f_g * n_t / f_s);
figure, plot(Giris);

giris_fft = fft(Giris, f_s);
giris_fft_new = zeros(1, 32);
giris_fft_new = 2*[giris_fft(1:8) ...
    zeros(1,16) giris_fft(9:16)];

giris_new = real(ifft(giris_fft_new, 32));
figure, plot(giris_new);
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 18 Eylül 2016, 18:06:37
Sağol. fakat matlab bilgim sıfır. hiç kullanmadım. Delphi ile program yazıyorum. Wav dosyayı stream olarak bayt bayt okuyup spektrum elde edebilirim.

matlab koduna baksam acaba yorum yapsam durum ne olur.
giris_fft_new = zeros(1, 32); ne demektir? yeni şekil ve fft başlat? olsa gerek. peki zeros ne ?

real(ifft(giris_fft_new, 32)); kısmı ile galiba tersFFT yapılıyor. fft dizisinden asıl diziyi elde ediyoruz değil mi? elimde inverse FFT rutini de vardı. bunlardan  bir netice alabilirim sanırım. FFT dizisinden bazı elemanları çıkarıp  yeni dizi elde etmek için IFFT mi yapıyoruz? veya çıkarmadan parametre değişimi ile mi yapıyoruz? bu kısmı anlayabilsem delphi kodunu uyarlayabilirim.


hocam elimdeki demo kod şöyle çalışıyor. 3 tane farklı sinüs dalgası var.  bunların genliklerini toplayıp yeni genlik elde ediyoruz. N sayıları aynı.  1. diziden 1. genlik. 2. diziden 1. genlik... toplanarak yeni dizinin 1. genliği bulunuyor. 

Bu şimdi  tek bir dizidir. bu diziyi FFT yaptığımızda bu 3 farklı  sinüs   için spektrum aynen çıkıyor. ayarladığımız genlikler elimizde. fakat ilk orijinal dalgayı bu genliklerden nasıl oluşturacağız? hem de öyle bir ayar yapılacak ki örnekleme frekansı değişecek. aradaki örnekler de ortaya çıkacak?
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 18:09:43
Sizi ilgilendiren kısım FFT'yi aldıktan sonra giris_fft_new = 2*[giris_fft(1:8)  zeros(1,16) giris_fft(9:16)]; işlemini yapmak. Görülceği üzere ilk kısma fft'nin ilk parçasını yazıyorz. Daha sonra kaç ile genişletecek isek FFT uzunluğunun katı kadar sıfır ekliyoruz. 2 kat için 1 FFT boyu ekledik. 3 kat için 2 FFT boyu sıfır ekleyecektirk. Son kısmada FFT'nin kalan kısmını ekliyoruz. Real işlemi ise inverse FFT sonrasında gerçel kısmı almamızı sağlıyor. Birde genlik normalizasyonu için kaç ile genişletecek isek onun ile çarpıyoruz. 2'nin amacı budur.

Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 18 Eylül 2016, 18:18:19
Anlayamadım malesef,  elimizde 8khz örneklenmiş tek dalga var bunu genişletmek ve yeniden 16khz örneklenmiş gibi oluşturabilmek için işlem sırasını öğrenebilir miyim?

Orijinal dalga  tam sinüs değil. hangi bileşenlerden oluşmuş bilmiyoruz.
Dalga değişecek çünkü. ses dalgası? konuşma sesi olsun. Düşük kaliteli yapılmış kaydımızı, yüksek kaliteli formata çeviriyoruz. (kalite artış umudum yok. sadece formatı düzgün çevirelim yeter.)
Hocam demo amaçlı wav dosyayı da şuraya yükledim. sizde matlab varsa  bu upsample işlemini yapabilir misiniz? 16khz örneklenmiş yeni dosya elde edilecek.   işlem başarıyla bittikten sonra gerekli matlab kodunu burada paylaşırsanız, kodu anlamak ve delphiye uyarlamak için yeniden rahatsız edebilirim (http://picproje.org/Smileys/default/smiley.gif)

Teşekkür ederim.

Deneme test wav dosya:
http://uppit.com/aqpnq9c4optx (http://uppit.com/aqpnq9c4optx)




(http://i67.tinypic.com/oppfsy.jpg)
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 18:35:29
2 türlü bu işlemi yapabilirsiniz. 1. si FFT'li olan. İşlem sırası şu şekilde:
FFT'yi alırız.
2 Katına çıkaracak ise FFT'nin boyunun 2 katı katar uzunlukta bir dizi oluşturup tüm değerlerine sıfır atanır
Yeni dizinin ilk kısmına FFT'nin FFT'uzunluğunun yarısı kadar olan değerleri yazarız.
Daha sonra FFT'nin son kısmını yeni dizinin sondan FFT'uzunluğunun yarısı kadar olan değerleri yazarız.
Inverse FFT'nin gerçel kısmını alırız.

2. İşlemde ise dizide yukarı örnekleme için kaç kata çıkacak isenin bir eksiği kadar sıfır eklenir. [1 2 3] değerlerini 2 katına çıkarmak için [1 0 2 0 3] şeklinde olacak.
Interpolasyon filtre katsayılarını bulmanız gerekcektir. MATLAB'da bunun için hazır komut var
Bu katsayılar ile konvolüsyon işlemi yapacaksınız.

Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 18 Eylül 2016, 18:38:47
Sağol varol. hocam  yukarıda 8k wav dosyayı yükledim. sizin için kolay bir işlem gibi görünüyor. kesin işlemleri sırayla yapıp bana matlab kodunu iletiverseniz?  oradan bakıp çalışayım? teşekkürler. saygılar.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 18:48:41
Aşağıki gibi kodları gerçekleştirebilirsiniz.


clc, clear all; close all;

[Data f_s] = audioread('test8k.wav');
figure, plot(Data);
Data_new = zeros(1, length(Data))
for n_i = 1 : length(Data)
    Data_new(2 * n_i - 1) = Data(n_i);
end

%% Bu katsayılar sizin değerlerinize göre ayarlanıyor.
Coeff = intfilt(1, 2, 0.5);

Data_new = filter(Coeff, 1, Data_new);
figure, plot(Data_new);
audiowrite('test16k.wav', Data_new, 2 * f_s)
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 18 Eylül 2016, 19:54:46
Hocam,  örnek kopyalama,  araya sıfır ekleme yöntemi yerine,  fft olanı yapmam lazım. 
Galiba daha iyi olacak. Karecikler sanki düzelecek diye umuyorum.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 19:58:05
Hocam buda aynı işi yapıyor. Biri frekans düzleminde biri zaman düzleminde. İşlem açısından size daha avantaj sağlayacaktır.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 18 Eylül 2016, 20:07:37
Peki bu yöntem,  ilk mesajda bildirdiğim makaledeki ile aynı mıdır?
Aynı yöntemi kullanan uygulamalar denemiştim güzel  çeviriyor.  Örnek Audacity.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 20:11:39
Çok emin olmamak ile birlikte benzer bir yöntemdir diyebilirim. Açıkçası ben sesleri dinlediğimde çevrim işlemi başarılı duruyor..
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: z - 18 Eylül 2016, 20:19:23
@alicavuslu

FFT nin iki katı datalar kullanmak amacıyla araya sıfırlar koymakla iki sample arasına örnekleme frekansında bir sinüs geçişi yapmış olmuyor muyuz. Bunun sese nasıl bir renk katmasını bekleyebiliriz?

@t2

Bir ara FFT videoları hazırlamış ve bir tane de exe program yayınlamıştım.

Onda sinyalle grafiksel olarak oynanabiliyordu diye hatırlıyorum. Sanki fikir verebilir gibi. (Yanlış da hatırlıyor olabilirim)
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 20:23:02
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.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: z - 18 Eylül 2016, 20:24:21
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ı?
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 21:03:25
Hocam dediğiniz kısmı çok anlayamadım...
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: z - 18 Eylül 2016, 21:13:41
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
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 21:19:37
Hocam verdiğiniz linlerden fikir yürütecek olursam zaman domaininde konvolüsyon işlemi yapılıyor diyebilirim...
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: z - 18 Eylül 2016, 21:25:37
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?
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 21:37:25
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
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: z - 18 Eylül 2016, 21:43:49
Ama o konvolüsyon kısmı sample alma işlemi değilmi?

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

Sample alma işleminin hemen ardından triangular fonksiyondan bahsetmiş.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 22:11:05
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 (http://web.cecs.pdx.edu/~tymerski/ece452/Chapter3.pdf)
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 18 Eylül 2016, 22:21:18
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. 
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 18 Eylül 2016, 22:28:38
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 (http://uppit.com/6k1dg2b83rh4)
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 18 Eylül 2016, 22:35:18
Başarılı çevirme yapabilen  orijinal açık kodlu program wavesurfer:
https://sourceforge.net/projects/wavesurfer/ (https://sourceforge.net/projects/wavesurfer/)

Orijinal ve başarıyla çevrilmiş yeni sinyaller aşağıdadır.
http://uppit.com/df50qxlrqggc (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 (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?

(http://i67.tinypic.com/oppfsy.jpg)



Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: z - 18 Eylül 2016, 23:54:35
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.

Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: ferdem - 19 Eylül 2016, 00:58:01
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 (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')

(http://i.hizliresim.com/B8a5lQ.jpg) (http://hizliresim.com/B8a5lQ)


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.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 19 Eylül 2016, 09:18:00
Ç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.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: alicavuslu - 19 Eylül 2016, 10:05:34
Sıfır geçişlerinin olması çok doğal. Çünkü filtre katsayılarını sınırlı sayıda yaptığımızdan değişiklik olmuyor. Katsayıları intfilt(2, 2, 0.6); şeklinde tekrar elde ederseniz sıfır geçişlerinin olmadığı sinyali elde edebilirsiniz.

http://uppit.com/xwkvlyp7mmzq (http://uppit.com/xwkvlyp7mmzq)


Not 1: FFT için verilen MATLAB kodları aynı işlemleri yapıyor. Ferdem Hocamızınki sadece generic bir yapıdadır :)
Not 2: Size sürekli zaman düzeleminde işlem yapmanızı ısrar etmemin nedeni FFT'nin getireceği işlem yükünden kaçınmanız içindir.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 19 Eylül 2016, 10:29:15
Anlaşıldı hocam. Olay filtrede bitiyor. Filtreye çalışayım.
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: t2 - 19 Eylül 2016, 18:32:06
interpolasyon filtre formülü nasıl bir şey acaba? detayını nasıl bulabilirim?
Daha önce farkında olmadan bu noktaya gelmiş ve aşağıdaki soruyu sormuştum

https://www.picproje.org/index.php/topic,65557.0.html (https://www.picproje.org/index.php/topic,65557.0.html)

Bu sorudaki hesabı yapabilirsek filtreyi icat etmiş oluruz sanırım. 
Sanki analog devre varmış gibi voltajı bulsak yeterli. 
Başlık: Ynt: Fourier transformu ile resample - [ Bulmaca, ödev, yarışma :) ]
Gönderen: ferdem - 25 Eylül 2016, 19:16:17
Örnek aralarına 0 ekleyip (veri sayısı 2 katına çıktı) dijital "lowpass" FIR filtreden geçirince sonuç aşağıdaki gibi oluyor:
(http://i.hizliresim.com/B8bvvg.jpg) (http://hizliresim.com/B8bvvg)

FIR filtre katsayıları MATLAB FDA tool dan veya internetteki araçlarla bulunabilir. Kesim frekansı örnekleme frekansının yarısı veya aşağısı seçmek gerekiyor. Örneğin fs i 16000 seçip kesim frekansı da 3.5k seçtim, aşağıdaki siteden katsayıları bulabilirsiniz:
http://www.arc.id.au/FilterDesign.html (http://www.arc.id.au/FilterDesign.html)
(http://i.hizliresim.com/6mv92E.jpg) (http://hizliresim.com/6mv92E)
b katsayıları:
Alıntı Yap
-0,000138000000000000
-0,000774000000000000
0
0,00229300000000000
0,00136900000000000
-0,00434200000000000
-0,00520200000000000
0,00560400000000000
0,0125120000000000
-0,00349200000000000
-0,0234030000000000
-0,00593700000000000
0,0365960000000000
0,0289210000000000
-0,0495100000000000
-0,0821230000000000
0,0590040000000000
0,309732000000000
0,437500000000000
0,309732000000000
0,0590040000000000
-0,0821230000000000
-0,0495100000000000
0,0289210000000000
0,0365960000000000
-0,00593700000000000
-0,0234030000000000
-0,00349200000000000
0,0125120000000000
0,00560400000000000
-0,00520200000000000
-0,00434200000000000
0,00136900000000000
0,00229300000000000
0
-0,000774000000000000
-0,000138000000000000

Bu katsayılarla Delphi de bir FIR filtre gerçekleyin, sonucu siz de görün. Adamlar(cooledit) da çok benzer bir işlem yapmışlar, çıkışlar çok benziyor çünkü:
Alıntı Yap
data2=[data_8k zeros(length(data_8k),1)];
data2=reshape(data2.',2*length(data_8k),1);
data3=filter(bx,1,data2);
wavwrite(2*data3,16000,'interpolated_w_filter');

local_data=2*data3;
local_data=local_data.';
local_data=[local_data(17:end) zeros(1,17)];
plot(local_data);
hold on
plot(data_converted,'r');

(http://i.hizliresim.com/rEN6oB.jpg) (http://hizliresim.com/rEN6oB)

Yeterince sık(fs>=Nyquist) örneklenmiş bir "lowpass" sinyalin kayıpsız geri elde edilmesi("reconstruction") teorik olarak mümkün, fs/2 kesim frekanslı ideal bir "lowpass" filtre çıkışı orijinal sinyali verecektir.
Gerçekte ideal olmasa da ideale yakın filtreler kullanılır, yukarıda yapmak istediğimiz gibi.
Bu arada bir yerde şu bilgiye rastladım, dijital tarafta "upsampling" yaparak çıkışta kullanılacak DAC devresinin gereksinimi gevşetilebiliyormuş [1]. "Upsampling" yapmanın en mantıklı sebeplerinden biri olmalı.
Alıntı Yapthe sampling rate is increased by a factor of M in discrete time, in
order to reduce the demands of the D/A conversion. This allows us
to use a very simple D/A converter.

[1] http://www.ece.iastate.edu/~namrata/EE424/l1.pdf (http://www.ece.iastate.edu/~namrata/EE424/l1.pdf)