Pitch Shifting [czy da się uniknąć FFT?]

0

Witam !
Chcialem prosic o kilka wskazówek odnosnie programu, ktorego zadaniem jest obniżenie dźwięku np sampla wav o jedna oktawę.

Z początku pomyślałem iż działając na buforze próbek obniżę oktawę robiąc taki myk:
BuforOryginalny zawiera np: 1 2 3 4 5

BuforZmieniony teraz zawiera: 1 1 3 3 5 5 czyli wydawało mi się że rozciągne to w czasie i obniże tą oktawę jednak nie uzyskalem zamierzonego efektu.
Drugim sposobem na jaki wpadlem to byla modulacja amplitudowo fazowa AM (jednak tak tez nic nie zdziałąłem)

Wyczytalem ze działania jakie chce osiągnac to cos na styl Pitch Shifting (obrobka czestotliwosci w czasie) do czego potrzebna jest Szybka transformata Fouriera ... dla mnie masakra.
Czy moglby ktos cos podpowiedziec jak obniżyc sampel o oktawę nie kotrzystając z FFT ? ewentualnie jakieś wskazówkie wszystko sie przyda.

Link do źródełka, wczytanie pliku *.wav (operacje jakich tutaj dokonałem tyczyły się wyłącznie bufora danych) http://www.nevs.republika.pl/kod.txt

Pozdrawiam. ;-)</b>

0

Zrób taki "myk", żeby na wyjściu było 1 1 2 2 3 3 4 4 5 5, bo to co dałeś obniży dźwięk jedynie o 20%, już nie mówiąc o zniekształceniach (nie wiem skąd wziąłeś te wartości).

Czy moglby ktos cos podpowiedziec jak obniżyc sampel o oktawę nie kotrzystając z FFT?

Większość tego typu rzeczy oparta jest o FFT. Nie masz innego wyjścia, musisz wgryźć się w FFT ;)

TU całkiem ładnie opisane jest FFT i PS.

0

Udalo sie częsciowo ! Jednak nie osiagnalem pitch shiftingu jednak cos na rodzaj down tempo. Otoz sprobkowalem bufor tak 1 1 2 2 3 3 4 4 5 5 i rozciagnalem to w czasie... wiem ze to nie jest obnizenie oktawy lecz spowolnienie odtworzenia sampla, ale to juz cos, ktos ma jakis jeszcze pomysl ? zeby pominac FFT

a tak to zapetlilem dla probek:
for(i=0;i<Buffor_2x;i=i+2){
tab2[i]=tab[j];
tab2[i+1]=tab[j];
j=j+1;
} // i na wyjsciu rozciagnalem to w czasie.

Znalazlem tu gotowy kod źródłowy ale nie kompiluje sie http://downloads.dspdimension.com/smbPitchShift.cpp. Probowalem zmienic rzutowanie typów i dodac funkcję main() zeby przynajmniej zobaczyc jak to dziala ale nie udalo mi sie ;-), ktos mi podpowie jak z tym kodzikiem sobie poradzic pod Dev-C++ [soczek]

0

Nie wiem co ci się tam nie kompiluje, u mnie idzie bez problemu (CodeBlocks, gcc 3.4.5).

0

Mingw/GCC 3.4.2 tu nie dziala a niestety nie wiem jak zainstalowac pod Windowsem Gcc 3.4.5 nigdy o tym nie myslalem... raczej jestem niedzielnym programista ktos podpowie ? [system Windows XP]

0

Heh, w tym przypadku numerki w wersji kompilatora nie mają większego znaczenia. Też kompilowałem pod windowsem i poza dwoma warningami przeszło gładko. A jeśli masz jakieś błędy kompilacji, to wypadałoby je sprecyzować.

0

kod programu do pobrania tutaj
http://downloads.dspdimension.com/smbPitchShift.cpp

In function void smbPitchShift(float, long int, long int, long int, float, float*, float*)': [Warning] converting to long int' from double' [Warning] converting to long int' from float' [Linker error] undefined reference to __cpu_features_init'
[Linker error] undefined reference to `WinMain@16'
ld returned 1 exit status

Staralem sie dokonac konwersji typow ... nie dalem rady
Staralem sie dodac int main(){...} takze nie dalem rady chyba w nieodpowieni sposob to robilem

0

Zamiast samodzielnie dodawać main, zrób nowy projekt, tak jak robisz inne projekty, i dodaj do niego ten plik (opcja add to project lub coś w tym stylu). Plik nie ma własnego nagłówka, więc przed użyciem funkcji smbPitchShift musisz ją zadeklarować dodając linijkę:

void smbPitchShift(float, long, long, long, float, float*, float*);

Powinno być git...

0

Ok a wracajac do mojego kodu gdzie mam strukture wczytujaca dane *.WAV

typedef struct _WAVEHEAD {
struct {
char RIFF[4];
unsigned long Size;
char WAVE[4]; //okresla format pliku
} RIFF;
struct {
char fmt[4] ;
unsigned long BlockSize;
struct {
unsigned short AudioFormat;
unsigned short NumChannels;
unsigned long SampleRate;
unsigned long ByteRate;
unsigned short BlockAlign;
unsigned short BitsPerSample;
} Format;
} fmt;
struct {
char data[4];
unsigned long DataSize;
} data;
} WAVEHEAD;

I teraz wczytalem sobie jakis plik *.WAV przypisal on odpowiednio dane do struktury... interesuje mnie teraz w jaki sposob by mozna sie dostac do tej struktury i wyedytowac SampleRate tak aby bylo wieksze dwukrotnie w ogóle sie da ?

Bo nic mi nie da popularne odwolanie sie do struktury typu:
_WAVEHEAD pierwszy;
pierwszy.fmt.Format.SampleRate = 88200;

Wpadlem na pomysl: ze jesli upchnę w bufor 2x tyle danych spowoduje zmiane dźwieku o OKTAWĘ jednak zeby to porpawnie dzialalo musze odwolac sie jakos równomiernie do czestotliwości próbkowania.

0
BlockAlign = NumChannels * BitsPerSample / 8;
ByteRate = BlockAlign * SampleRate;        

1 użytkowników online, w tym zalogowanych: 0, gości: 1