[{"data":1,"prerenderedAt":530},["ShallowReactive",2],{"doc-core-concepts,signals":3,"documentation-nav-slug":518},{"id":4,"title":5,"body":6,"category":509,"description":510,"extension":511,"meta":512,"navigation":82,"order":79,"path":513,"seo":514,"status":515,"stem":516,"__hash__":517},"documentation\u002Fdocumentation\u002Fcore-concepts\u002Fsignals.md","Understanding Signals",{"type":7,"value":8,"toc":486},"minimark",[9,13,17,22,25,48,53,143,147,151,207,211,216,224,228,234,238,244,248,252,259,265,269,272,301,305,309,312,337,341,344,378,382,386,416,420,423,438,442,469,473,482],[10,11,5],"h1",{"id":12},"understanding-signals",[14,15,16],"p",{},"Signals are the fundamental data carriers in SimFusion. This guide covers signal types, properties, and best practices.",[18,19,21],"h2",{"id":20},"signal-basics","Signal Basics",[14,23,24],{},"A signal in SimFusion consists of:",[26,27,28,36,42],"ul",{},[29,30,31,35],"li",{},[32,33,34],"strong",{},"Data",": The actual values (NDArray)",[29,37,38,41],{},[32,39,40],{},"Sample Rate",": Samples per second (Hz)",[29,43,44,47],{},[32,45,46],{},"Metadata",": Units, timestamps, channel names",[49,50,52],"h3",{"id":51},"creating-a-signal","Creating a Signal",[54,55,60],"pre",{"className":56,"code":57,"language":58,"meta":59,"style":59},"language-python shiki shiki-themes github-light github-dark","from simfusion import Signal\nimport numpy as np\n\n# Create a 1kHz sine wave\nt = np.linspace(0, 1, 1000)\ndata = np.sin(2 * np.pi * 10 * t)  # 10 Hz sine\n\nsignal = Signal(\n    data=data,\n    sample_rate=1000,\n    unit=\"V\",\n    name=\"Voltage Signal\"\n)\n","python","",[61,62,63,71,77,84,90,96,102,107,113,119,125,131,137],"code",{"__ignoreMap":59},[64,65,68],"span",{"class":66,"line":67},"line",1,[64,69,70],{},"from simfusion import Signal\n",[64,72,74],{"class":66,"line":73},2,[64,75,76],{},"import numpy as np\n",[64,78,80],{"class":66,"line":79},3,[64,81,83],{"emptyLinePlaceholder":82},true,"\n",[64,85,87],{"class":66,"line":86},4,[64,88,89],{},"# Create a 1kHz sine wave\n",[64,91,93],{"class":66,"line":92},5,[64,94,95],{},"t = np.linspace(0, 1, 1000)\n",[64,97,99],{"class":66,"line":98},6,[64,100,101],{},"data = np.sin(2 * np.pi * 10 * t)  # 10 Hz sine\n",[64,103,105],{"class":66,"line":104},7,[64,106,83],{"emptyLinePlaceholder":82},[64,108,110],{"class":66,"line":109},8,[64,111,112],{},"signal = Signal(\n",[64,114,116],{"class":66,"line":115},9,[64,117,118],{},"    data=data,\n",[64,120,122],{"class":66,"line":121},10,[64,123,124],{},"    sample_rate=1000,\n",[64,126,128],{"class":66,"line":127},11,[64,129,130],{},"    unit=\"V\",\n",[64,132,134],{"class":66,"line":133},12,[64,135,136],{},"    name=\"Voltage Signal\"\n",[64,138,140],{"class":66,"line":139},13,[64,141,142],{},")\n",[18,144,146],{"id":145},"signal-types","Signal Types",[49,148,150],{"id":149},"continuous-vs-discrete","Continuous vs Discrete",[152,153,154,170],"table",{},[155,156,157],"thead",{},[158,159,160,164,167],"tr",{},[161,162,163],"th",{},"Type",[161,165,166],{},"Description",[161,168,169],{},"Use Case",[171,172,173,185,196],"tbody",{},[158,174,175,179,182],{},[176,177,178],"td",{},"Continuous",[176,180,181],{},"Analog-style, time-based",[176,183,184],{},"Audio, sensor data",[158,186,187,190,193],{},[176,188,189],{},"Discrete",[176,191,192],{},"Event-based, irregular timestamps",[176,194,195],{},"Packet data, transactions",[158,197,198,201,204],{},[176,199,200],{},"Frame-based",[176,202,203],{},"Batches of samples",[176,205,206],{},"Video, image sequences",[49,208,210],{"id":209},"common-signal-patterns","Common Signal Patterns",[212,213,215],"h4",{"id":214},"audio","Audio",[54,217,222],{"className":218,"code":220,"language":221},[219],"language-text","Shape: (channels, samples)\nExample: (2, 48000)  # Stereo, 1 second at 48kHz\n","text",[61,223,220],{"__ignoreMap":59},[212,225,227],{"id":226},"video","Video",[54,229,232],{"className":230,"code":231,"language":221},[219],"Shape: (frames, height, width, channels)\nExample: (30, 1080, 1920, 3)  # 1 second at 30fps\n",[61,233,231],{"__ignoreMap":59},[212,235,237],{"id":236},"sensor-array","Sensor Array",[54,239,242],{"className":240,"code":241,"language":221},[219],"Shape: (sensors, timepoints)\nExample: (64, 1000)  # 64 EEG channels, 1 second at 1kHz\n",[61,243,241],{"__ignoreMap":59},[18,245,247],{"id":246},"sampling-theory","Sampling Theory",[49,249,251],{"id":250},"nyquist-rate","Nyquist Rate",[14,253,254,255,258],{},"To avoid aliasing, sample at ",[32,256,257],{},">2x"," the highest frequency:",[54,260,263],{"className":261,"code":262,"language":221},[219],"Signal bandwidth: 0-20 kHz\nMinimum sample rate: 40 kHz\nRecommended: 44.1 kHz or 48 kHz\n",[61,264,262],{"__ignoreMap":59},[49,266,268],{"id":267},"resampling","Resampling",[14,270,271],{},"Change sample rate while preserving information:",[54,273,275],{"className":56,"code":274,"language":58,"meta":59,"style":59},"# Downsample from 48kHz to 16kHz\ndownsampled = signal.resample(target_rate=16000)\n\n# Upsample with interpolation\nupsampled = signal.resample(target_rate=96000, method='cubic')\n",[61,276,277,282,287,291,296],{"__ignoreMap":59},[64,278,279],{"class":66,"line":67},[64,280,281],{},"# Downsample from 48kHz to 16kHz\n",[64,283,284],{"class":66,"line":73},[64,285,286],{},"downsampled = signal.resample(target_rate=16000)\n",[64,288,289],{"class":66,"line":79},[64,290,83],{"emptyLinePlaceholder":82},[64,292,293],{"class":66,"line":86},[64,294,295],{},"# Upsample with interpolation\n",[64,297,298],{"class":66,"line":92},[64,299,300],{},"upsampled = signal.resample(target_rate=96000, method='cubic')\n",[18,302,304],{"id":303},"signal-operations","Signal Operations",[49,306,308],{"id":307},"arithmetic","Arithmetic",[14,310,311],{},"Signals support vectorized operations:",[54,313,315],{"className":56,"code":314,"language":58,"meta":59,"style":59},"# Element-wise operations\nresult = signal1 + signal2\nresult = signal1 * 2.5\nresult = Signal.concat([sig1, sig2], axis=0)\n",[61,316,317,322,327,332],{"__ignoreMap":59},[64,318,319],{"class":66,"line":67},[64,320,321],{},"# Element-wise operations\n",[64,323,324],{"class":66,"line":73},[64,325,326],{},"result = signal1 + signal2\n",[64,328,329],{"class":66,"line":79},[64,330,331],{},"result = signal1 * 2.5\n",[64,333,334],{"class":66,"line":86},[64,335,336],{},"result = Signal.concat([sig1, sig2], axis=0)\n",[49,338,340],{"id":339},"windowing","Windowing",[14,342,343],{},"Apply time windows for spectral analysis:",[54,345,347],{"className":56,"code":346,"language":58,"meta":59,"style":59},"# Hanning window\nwindowed = signal.window('hanning', size=1024)\n\n# Custom window\nwindow = np.hamming(512)\nwindowed = signal.apply_window(window)\n",[61,348,349,354,359,363,368,373],{"__ignoreMap":59},[64,350,351],{"class":66,"line":67},[64,352,353],{},"# Hanning window\n",[64,355,356],{"class":66,"line":73},[64,357,358],{},"windowed = signal.window('hanning', size=1024)\n",[64,360,361],{"class":66,"line":79},[64,362,83],{"emptyLinePlaceholder":82},[64,364,365],{"class":66,"line":86},[64,366,367],{},"# Custom window\n",[64,369,370],{"class":66,"line":92},[64,371,372],{},"window = np.hamming(512)\n",[64,374,375],{"class":66,"line":98},[64,376,377],{},"windowed = signal.apply_window(window)\n",[18,379,381],{"id":380},"metadata-and-annotations","Metadata and Annotations",[49,383,385],{"id":384},"adding-metadata","Adding Metadata",[54,387,389],{"className":56,"code":388,"language":58,"meta":59,"style":59},"signal.set_metadata({\n    \"sensor_id\": \"TEMP_01\",\n    \"location\": \"Room A\",\n    \"calibration_date\": \"2024-01-15\"\n})\n",[61,390,391,396,401,406,411],{"__ignoreMap":59},[64,392,393],{"class":66,"line":67},[64,394,395],{},"signal.set_metadata({\n",[64,397,398],{"class":66,"line":73},[64,399,400],{},"    \"sensor_id\": \"TEMP_01\",\n",[64,402,403],{"class":66,"line":79},[64,404,405],{},"    \"location\": \"Room A\",\n",[64,407,408],{"class":66,"line":86},[64,409,410],{},"    \"calibration_date\": \"2024-01-15\"\n",[64,412,413],{"class":66,"line":92},[64,414,415],{},"})\n",[49,417,419],{"id":418},"time-stamps","Time Stamps",[14,421,422],{},"For irregular sampling or event data:",[54,424,426],{"className":56,"code":425,"language":58,"meta":59,"style":59},"timestamps = np.array([0.0, 0.1, 0.25, 0.3, 0.5])\nevent_signal = Signal(data=values, timestamps=timestamps)\n",[61,427,428,433],{"__ignoreMap":59},[64,429,430],{"class":66,"line":67},[64,431,432],{},"timestamps = np.array([0.0, 0.1, 0.25, 0.3, 0.5])\n",[64,434,435],{"class":66,"line":73},[64,436,437],{},"event_signal = Signal(data=values, timestamps=timestamps)\n",[18,439,441],{"id":440},"best-practices","Best Practices",[443,444,445,451,457,463],"ol",{},[29,446,447,450],{},[32,448,449],{},"Always specify units"," — Prevents calculation errors",[29,452,453,456],{},[32,454,455],{},"Check sample rates"," — Mismatched rates cause issues",[29,458,459,462],{},[32,460,461],{},"Use appropriate dtypes"," — float32 vs float64 tradeoffs",[29,464,465,468],{},[32,466,467],{},"Chunk large signals"," — Memory-efficient processing",[18,470,472],{"id":471},"see-also","See Also",[26,474,475],{},[29,476,477],{},[478,479,481],"a",{"href":480},"\u002Fdocumentation\u002Fblock-system","Block System",[483,484,485],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":59,"searchDepth":73,"depth":73,"links":487},[488,491,495,499,503,507,508],{"id":20,"depth":73,"text":21,"children":489},[490],{"id":51,"depth":79,"text":52},{"id":145,"depth":73,"text":146,"children":492},[493,494],{"id":149,"depth":79,"text":150},{"id":209,"depth":79,"text":210},{"id":246,"depth":73,"text":247,"children":496},[497,498],{"id":250,"depth":79,"text":251},{"id":267,"depth":79,"text":268},{"id":303,"depth":73,"text":304,"children":500},[501,502],{"id":307,"depth":79,"text":308},{"id":339,"depth":79,"text":340},{"id":380,"depth":73,"text":381,"children":504},[505,506],{"id":384,"depth":79,"text":385},{"id":418,"depth":79,"text":419},{"id":440,"depth":73,"text":441},{"id":471,"depth":73,"text":472},"Concepts","Deep dive into signal types, sampling, and data representation in SimFusion","md",{},"\u002Fdocumentation\u002Fcore-concepts\u002Fsignals",{"title":5,"description":510},"stable","documentation\u002Fcore-concepts\u002Fsignals","6C40SMcxeWX-t1n61TCM_0FGnKZ-_KSOTzzmYkyI29Y",[519,522,525,526,527],{"title":520,"path":521,"order":67},"Getting Started","\u002Fdocumentation\u002Fgetting-started",{"title":523,"path":524,"order":73},"Core Concepts","\u002Fdocumentation\u002Fcore-concepts",{"title":5,"path":513,"order":79},{"title":481,"path":480,"order":86},{"title":528,"path":529,"order":92},"API Reference","\u002Fdocumentation\u002Fapi",1784562700028]