ahawk |
помучить вас что-ли? )))
В общем сам не нуб, но немного не понимаю. Дело в следующем:
при обработке сигнала есть такие хорошие вещи как fft и ifft. Есть входной вектор 8000 отсчётов по 2 байта на отсчёт. Размер на выходе не подскажите? Проблема в следующем: fft и ifft описаны как double и преобразование double в int не проходит есть элементы размером больше чем помещается в int. Это так и должно быть или я чего-то не понимаю?
Всем спасибо ;)
|
Поршинь |
мне кажется тут я чего-то не понимаю, а не ты =)
|
radiostorm |
с радостью помогу. а что такое fft, ifft, вектор 8000 отсчетов по 2 байта на отсчет? остальное я вроде понял =)
|
Wolwerine_vovan |
1, а о чем речь вообще? =)
|
ahawk |
radiostorm
1. http://ru.wikipedia.org/wiki/FFT
2. смотри пункт 1
3. матрица 1х8000 элементом может быть любое целое число из диапазона -32768 до +32767
|
kyner |
Димка зачётный вопрос задал
я нуб и не скрываю этого
|
malin |
ваще ничего не смыслю. Но по интуиции в результате прямого Фурье длина спектра (точнее, спектр получается чуть позже) равна длине ряда. Обратное преобразование дает длину исходника. У тебя что, ряд int ? Сделай из него даблю.
|
ahawk |
7 так и делаю, но на выходе опять из double int получить нужно, иначе вместо 16к придётся 64 по сети передавать ;)
|
malin |
8. Хм, не сталкивался. А что, это трудно? Вроде бери целую часть и переходи к инту. (Ей Богу, никогда этого не делал)
|
malin |
9+. Кстати, в Матлабе есть куча всякого, например int8, int16...
I = int*(X) converts the elements
of array X into signed integers. X can
be any numeric object (such as a double). The results of
an int* operation are shown in the next table.
Там же вроде должны быть подпрограммы, которые это удовольствие получают
|
ahawk |
9 число типа int может принимать значение из диапазона -32768 до+32767, типа double -1,7*10^-308 до 1,7*10^308
почему-то при преобразованиях получаются числа порядка 59000, а это уже не int
10 вот вот, матлаб и считает ;)
|
malin |
11. Копирую в онлайне из Матлаба:
>> aa=22222222.19
aa =
2.2222e+007
>> int32(aa)
ans =
22222222
не могу сосчитать, но ответ вроде больше 32767
|
ahawk |
12 бери int16 и получишь меньше 32767. Но вопрос не в этом, вопрос в том: это нормально что при входном 2х байтном векторе выходной получается не 2х байтный или нет?
|
malin |
Правда сжульничал - взял 32 битный инт. А из него можно получить нужное значение 2-битное?
|
ahawk |
увы, нельзя. Это всё равно что Землю(планету) в карман положить )
|
malin |
15. Жаль. (что нельзя положить).
А с др. стороны, что-то не вяжется. FFT -> IFFT дает ряд один-в-один. Т.е. и выходные значения не могут сильно превышать исходник. Если, конечно, как-то БПФ не корежил, например, фильтровал.
А что за обработка?
|
malin |
16+. А типа умножить исходник на какой-нить коэффициент (e.g. 0,1), а затем, соответственно, учесть на выходе, или скорее всего, передавать как необходимый коэфф. ?
|
ahawk |
да-да, именно это ))) не просто же так fft->ifft делать, нужно со спектром по развлекаться, порезать его, по переставлять (скремблирование). Путь мой таков:
[2х байтный вектор]->fft->[всяческие перестановки, изменения (но только внутри полученных значений)]->ifft->[хотелось бы 2х байтный вектор в итоге] ;)
|
malin |
18. Ни фига себе. А если спектр получится узкий? Тогда у тебя при обратке вполне реально выбросы могут быть. И никак не влезут куда надо
|
ahawk |
19 откуда он узкий-то будет? он какой был по ширине такой и останется, я же только местами меняю амплитуды гармоник, ничего нового не вношу. Он мне как дал что спектр лежит в диапазоне от 0 до 4000Гц, так и останется, только кусками будет сделано не так как изначально, а, например^
[1000-2000][0-1000][3000-4000][2000-3000]
и вот от этого и брать ifft
|