Форум: "Потрепаться";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];
ВнизЧастота Найти похожие ветки
← →
Sergo (2002-04-24 13:08) [0]Как можно получить частоту входного сигнала на звукаху?
← →
VictorT (2002-04-24 13:21) [1]С амплитудой разобрался?
Формула для частоты:
f = 1/T,
где Т - период.
Чтобы определить период, я думаю можно замерять время между соседними локальными максимумами. Если опять выразился непонятно, приведу текст программы.
← →
Sergo (2002-04-24 13:29) [2]>VictorT ©
Спасибо что опять откликнулся. Да с амплитудой я разобрался.
Формула для частоты:
f = 1/T,
где Т - период.
Эту формулу я знаю, а вот с замером времени... если не трудно напиши код.
А через БПФ нельзя узнать?
← →
VictorT (2002-04-24 13:46) [3]Не знаю, что такое БПФ :(
Сейчас ухожу на обед, код напишу чуть позже.
← →
Sergo (2002-04-24 13:48) [4]БПФ это быстрое преобразование фурье
← →
Digitman (2002-04-24 14:38) [5]Вот сиди тут и думай, о какой "частоте" ты речь ведешь ...
БПФ как раз есть первое , что можно рекомендовать. Ты ж ничего не сказал о заведомо определенной АЧХ анализируемого сигнала : сложный сигнал или нет, меняется спектр во времени или нет, периодически или апериодически ... Может, это вообще - "белый шум" ? Тогда задача нерешаемая.
← →
Sergo (2002-04-24 15:28) [6]>Digitman ©
Сигнал предполагается практически неизменным во времени по амплитуде и частоте, но все же эти параметры могут меняться, спонтанно.
← →
AFROLOV (2002-04-24 15:41) [7]Надо не промахнуться с частотой дискретизации при снятии АЧХ - посмотри "Теорема Котельникова". Иначе можно получить кучу мусора (при низкой частоте дискретизации) или много лишних данных (при высокой) - как следствие очень большое время обработки.
← →
Digitman (2002-04-24 15:41) [8]>Sergo
Какой частоте-то ? Какой гармоники ? Если гармоник нет, можно и без БПФ обойтись. Иначе задача сводится к определению частоты осн.тона сигнала, имеющего постоянный спектр.состав, а это как раз и дает повод как минимум для применения БПФ
← →
VictorT (2002-04-24 15:50) [9]Да, после написаного тут наверное надо погодить с кодом, вначале получше разобраться с проблемой.
← →
Sergo (2002-04-24 15:54) [10]>Digitman ©
Частота в диапазоне 50 Гц +-10гц, гармоник: в лучшем случае одна, в худшем 3, количество гармоник я контролировать (они также возникают спонтанно) не могу, но мне их нужно отследить.
← →
Sergo (2002-04-24 15:55) [11]Сигнал моно 8бит, частота дискретизации 22,5 кГц.
← →
VictorT (2002-04-24 15:56) [12]Да, кстати, гляньте сюда:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1018853239&n=3
всё ли там в порядке, а то в свете вышенаписаного сомнения возникли.
← →
Sergo (2002-04-24 15:59) [13]> VictorT ©
А зачем туда смотреть?
← →
AFROLOV (2002-04-24 16:02) [14]Для надежного разделения сигналов с близкими частотами необходим большой периуд наблюдения.
← →
Sergo (2002-04-24 16:04) [15]>AFROLOV ©
Насколько большой?
← →
VictorT (2002-04-24 16:07) [16]
> А зачем туда смотреть?
Да подумал, что тот метод может не подходить.
← →
Sergo (2002-04-24 16:13) [17]>VictorT ©
Да меня тоже берут сомнения, можно попробовать загонять данные за кокайто промежуток времени в массив и искать там максимальное значение (to all это у нас с VictorT © маленькое "лирическое" отступление от темы :))
← →
AFROLOV (2002-04-24 16:20) [18]Надо формулы посмотреть - я так не помню. Но чем ближе частоты тем больше должен быть периуд наблюдения.<=> Чем больше периуд наблюдения тем более близкие по частоте сигналы можно достоверно разделить.=> Преуд наблюдения выбирается из следующих соображений:
1. Минимальной разности частот между 2 сигналами, которые считаются разными.
2. Других соображений(скорость обработки, и т.д.)
Кстати, увеличение частоты дискретизации в разделении сигналов тебе не поможет.
В любой приличной книжке по обработке сигналов это есть.
← →
Digitman (2002-04-24 16:25) [19]>Sergo
Если 50Гц и гармоник не более 2-х, что мешает тебе установить частоту дискретизации, равной, скажем, 4кГц ? При такой частоте дискретизации БПФ при минимальных ресурсах системы вполне справится со своей задачей в real-time !
← →
Sergo (2002-04-24 16:26) [20]>AFROLOV ©
Спасибо
Но разделение сигналов не суть. Пойдем по легкому пути будем считать, что гармоника одна :)).
Но проблема так и не решилась :((. Как узнать частоту?
← →
VictorT (2002-04-24 16:26) [21]Посмотрел теорему Котельникова, если правильно понял, то частота дискретизации в данном случае должна быть 120 Гц.
← →
Sergo (2002-04-24 16:30) [22]Digitman ©
Я думал об этом. У меня есть готовый алгоритм БПФ, его мне дал HeadHanter (одно время он находился здесь, а счас че то не видать) вот его код:
А где здесь частота я че то не найду :((
unit dsp;
interface
type
TWaveHeader = record
Marker1: Array[0..3] of Char;
BytesFollowing: LongInt;
Marker2: Array[0..3] of Char;
Marker3: Array[0..3] of Char;
Fixed1: LongInt;
FormatTag: Word;
Channels: Word;
SampleRate: LongInt;
BytesPerSecond: LongInt;
BytesPerSample: Word;
BitsPerSample: Word;
Marker4: Array[0..3] of Char;
DataBytes: LongInt;
end;
procedure ClassicDirect(Var aSignal, aSpR, aSpI: Array Of single; N:LongInt);
procedure ClassicInverce(Var aSpR, aSpI, aSignal: Array Of single;N:LongInt);
implementation
function Power2(lPower: Byte): LongInt;
begin
Result := 1 Shl lPower;
end;
procedure ClassicDirect(Var aSignal, aSpR, aSpI: Array Of single; N:
LongInt);
var lSrch : LongInt;
var lGarm : LongInt;
var dSumR : single;
var dSumI : single;
begin
for lGarm := 0 to N div 2 - 1 do begin
dSumR := 0;
dSumI := 0;
for lSrch := 0 to N - 1 do begin
try dSumR := dSumR + aSignal[lSrch] * Cos(lGarm * lSrch / N * 2 * PI);
except end;
try dSumI := dSumI + aSignal[lSrch] * Sin(lGarm * lSrch / N * 2 * PI);
except end;
end;
aSpR[lGarm] := dSumR;
aSpI[lGarm] := dSumI;
end;
end;
procedure ClassicInverce(Var aSpR, aSpI, aSignal: Array Of single; N:
LongInt);
var lSrch : LongInt;
var lGarm : LongInt;
var dSum : single;
begin
for lSrch := 0 to N-1 do begin
dSum := 0;
for lGarm := 0 to N div 2 -1
do dSum := dSum + aSpR[lGarm] * cos(lSrch * lGarm * 2 * Pi / N)
+ aSpI[lGarm] * sin(lSrch * lGarm * 2 * Pi / N);
aSignal[lSrch] := dSum/n;
end;
end;
end.
← →
Sergo (2002-04-24 16:36) [23]>VictorT ©
Да ты прав, по теореме частота дискретизации должна вдвое превышать частоту входного сигнала. Но можно ли выставить такую частоту?
← →
Sergo (2002-04-24 16:57) [24]Ну че мне делать то :((
← →
VictorT (2002-04-24 17:04) [25]
> Но можно ли выставить такую частоту?
Я думаю, что просто програмно делать задержку и в нужный момент опрашивать звуковуху.
← →
Sergo (2002-04-24 17:06) [26]VictorT ©
Счас попробовал, у меня сразу буфер переполняется и прога виснет, а и вообще мне это ничего не дает.
← →
AFROLOV (2002-04-24 17:17) [27]Не совсем так. Согласно теореме Котельникова частота должна быть не менеечем в 2 раза больше - т.е. не менее 120 Гц. Если у тебя была больше - отлично. Просто ты сразу о параметрах сигнала ничего не сказал.
← →
Sergo (2002-04-24 17:20) [28]Как же высчитать частоту?
← →
AFROLOV (2002-04-24 17:35) [29]Взять любую больше 120 Гц и при которой твоя прога успевает данные обрабатывать.
← →
VictorT (2002-04-24 18:20) [30]Наверное скоро ухожу, так что приведу код, а вы уж без меня решите, подходит он или нет. Я там пообзывал некоторые функции, думаю догадаешься, что имелось в виду.
int value;
int value1 = 0;
int T = GetTime();
while(условие продолжения цикла) {
value = GetSignal();
if (value1 > value) {
Label1->Caption = FloatToStr(GetTime() - T);
T = GetTime();
}
value1 = value;
Wait();
}
← →
Sergo (2002-04-25 07:54) [31]>AFROLOV ©
Я поставил частоту дискретизации 22,5. А как узнать частоту входного сигнала?
← →
Sergo (2002-04-25 09:58) [32]HELP!!!
← →
Digitman (2002-04-25 10:10) [33]22.5кГц - это оч.много для 50Гц.
11кГц - еще куда не шло. Но, насколько мне известно, SB-совместимые карты позволяют выставлять и иные ЧД. Если драйвер карты это позволяет, задай ЧД в диапазоне от 1кгц до 4кГц.
Вот смотри, какой д.б. ход рассуждений и расчетов в данной задаче.
Предположим, ЧД = 1кГц., а ширина фрейма (ШФ, по сути - периодичность измерения вх.сигнала) = 1 сек. При 8-битном монорежиме оцифровки запись длительностью в ШФ секунд потребует 1кб буферной памяти. При этом в буфер будет записана инф-ция о ~ 50-ти периодах вх.сигнала. Это означает, что в полученном при прямом БПФ спектре сигнал частотой в ~ 50 раз превышающей частоту 1Гц (~ 1 / ШФ) , будет представлен ~ 50-й его гармоникой. Амплитуда 50-й гармоники (при том, что вх.сигнал, как ты говоришь, близок к синусоидальному) будет резко отличаться (в общем случае - иметь максимальное значение) от амплитуд прочих гармоник.
Исходя из этого, можно выбрать след.параметры вызова ClassicDirect() :
- aSignal - адрес собственно буфера фрейма;
- размер буфера фрейма N = 1024 (степень двойки !!! на этом базируется вся механика БПФ);
- M = 53 (50 + 3) (выбираемый размер массивов aSpR, aSpI; фактически M - это верхний частотный предел спектра, выше которого частотный анализ нас не интересует в дан.случае)
Результатом работы БПФ будут два заполненных массива aSpR и aSpI, содержащих соотв-но действительные и мнимые составляющие комплексных значений амплитуд упорядоченных (по возрастанию их номеров) гармоник в спектре фрейма вх.сигнала.
Абс. значение ампл-ды k-й гармоники может быть расчитано как aSp[k] = Sqrt(aSpR[k] ^ 2 + aSpI[k] ^ 2). При предполагаемой центральной частоте вх.сигнала ~ 50Гц, можно, проанализировав тем или иным образом некий результ.массив aSp[1..M] (в котором записаны расчитанные по этой формуле абс.зн-я амплитуд гармоник), убедиться, что индекс k максимального элемента массива aSp будет равен 50, что при заданной нами ШФ ~ 1сек. и дает как раз частоту осн.тона сигнала Fвх равной ~50 Гц.
Умешьшив ШФ, к примеру, в 2 раза (ШФ ~ 0.5 сек) для уменьшения периода измерения и, соотв-но, размеров буфера фрейма и массивов aSp, aSpR, aSpI для той же Fвх ~ 50 Гц мы получим иное значение k ~ 50 / 2 ~ 25, но при этом точность измерения, разумеется, понижается из-за особенностей БПФ, связанных с возможностью разложения сигнала в спектр, состоящий только из гармоник с целочисленными номерами.
← →
Sergo (2002-04-25 11:20) [34]У меня родилась идея и я хотел бы посоветоваться:
Я набираю в массив за период времени в 1 сек. значения синусоиды, ищу средених максимальное (амплитудное). Далее считаю количество амплитудных значений за этот период времени - это и будет частота. Конечно от realtime я буду немного отставать.
← →
Digitman (2002-04-25 11:51) [35]>Sergo
Слишком велика будет погрешность и частота сильно "скакать" будет от измерения к измерению. Если вообще получишь правильный результат - гармоники-то возможны, сам же говоришь. Чтобы сие "прокатило", нужно будет содержимое буфера фрейм "прогонять" через ФНЧ перед этим подсчетом, дабы свести до допустимого минимума влияние тех самых гармоник на безошибочность и "плавность" результата. А ФНЧ еще и дополнительную задержку внесет. Плюс - неоптимальность/неэффективность самого алгоритма подсчета (как, впрочем, и в случае с БПФ по приведенному тобой алгоритму в ClassicDirect) : ни MMX ни XMM не используются, а могли бы дать не менее чем 4-хкратное увеличение производительности сквозного тракта программного анализа сигнала.
Поэтому - так или иначе - по-любому рекомендую воспользоваться для своей задачи готовыми реализациями тех или иных выбранных тобой алгоритмов в библиотеке Intel Signal Processing Library v4.x (IntelSPL). Если, конечно, планируешь работу задачи на CPU от Intel. Мощь MMX- и XMM-технологий там задействована "на полную катушку". Есть там все : и векторно/матричные вычисления, и фильтры, и FFT - все, что душе угодно).. Есть в пакете с iSPL и оч.неплохой Делфи5-демо-проект (редкость вообще !), демонстрирующий визуально практически всю функц-ть библиотеки.
← →
Sergo (2002-04-25 12:03) [36]>Digitman ©
Пожалуйта подскажи не битую ссылку на IntelSPL, я много слышал о ней но никак не могу закачать ее.
← →
Digitman (2002-04-25 12:18) [37]http://downloadfinder.intel.com/scripts-df/Product_Filter.asp?ProductID=238
работает, проверено только что.
← →
Sergo (2002-04-25 13:10) [38]>Digitman ©
спасибо
← →
Sergo (2002-04-25 15:32) [39]>Digitman ©
У меня дельфовая демка ругается на nsp.dll не знаешь в чем может быть дело, система ХР?
← →
Digitman (2002-04-25 16:20) [40]>Sergo
И как ругается ?
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.007 c